numpy基本操作

r囧r小猫 2023-02-23 08:52 77阅读 0赞

numpy概述

  1. Numerical Python,数值的Python,补充了Python语言所欠缺的数值计算能力。
  2. Numpy是其它数据分析及机器学习库的底层库。
  3. Numpy完全标准C语言实现,运行效率充分优化。
  4. Numpy开源免费。

numpy历史

  1. 1995年,Numeric,Python语言数值计算扩充。
  2. 2001年,Scipy->Numarray,多维数组运算。
  3. 2005年,Numeric+Numarray->Numpy。
  4. 2006年,Numpy脱离Scipy成为独立的项目。

numpy的核心:多维数组

  1. 代码简洁:减少Python代码中的循环。
  2. 底层实现:厚内核©+薄接口(Python),保证性能。

numpy基础

ndarray数组

用np.ndarray类的对象表示n维数组

  1. import numpy as np
  2. ary = np.array([1, 2, 3, 4, 5, 6])
  3. print(type(ary))

内存中的ndarray对象

元数据(metadata)

存储对目标数组的描述信息,如:dim count、dimensions、dtype、data等。

实际数据

完整的数组数据

将实际数据与元数据分开存放,一方面提高了内存空间的使用效率,另一方面减少对实际数据的访问频率,提高性能。

ndarray数组对象的特点

  1. Numpy数组是同质数组,即所有元素的数据类型必须相同
  2. Numpy数组的下标从0开始,最后一个元素的下标为数组长度减1

ndarray数组对象的创建

np.array(任何可被解释为Numpy数组的逻辑结构)

  1. import numpy as np
  2. a = np.array([1, 2, 3, 4, 5, 6])
  3. print(a)

np.arange(起始值(0),终止值,步长(1))

  1. import numpy as np
  2. a = np.arange(0, 5, 1)
  3. print(a)
  4. b = np.arange(0, 10, 2)
  5. print(b)

np.zeros(数组元素个数, dtype=‘类型’)

  1. import numpy as np
  2. a = np.zeros(10)
  3. print(a)

np.ones(数组元素个数, dtype=‘类型’)

  1. import numpy as np
  2. a = np.ones(10)
  3. print(a)

ndarray对象属性的基本操作

**数组的维度:**np.ndarray.shape

  1. import numpy as np
  2. ary = np.array([1, 2, 3, 4, 5, 6])
  3. print(type(ary), ary, ary.shape)
  4. #二维数组
  5. ary = np.array([
  6. [1,2,3,4],
  7. [5,6,7,8]
  8. ])
  9. print(type(ary), ary, ary.shape)

**元素的类型:**np.ndarray.dtype

  1. import numpy as np
  2. ary = np.array([1, 2, 3, 4, 5, 6])
  3. print(type(ary), ary, ary.dtype)
  4. #转换ary元素的类型
  5. b = ary.astype(float)
  6. print(type(b), b, b.dtype)
  7. #转换ary元素的类型
  8. c = ary.astype(str)
  9. print(type(c), c, c.dtype)

**数组元素的个数:**np.ndarray.size

  1. import numpy as np
  2. ary = np.array([
  3. [1,2,3,4],
  4. [5,6,7,8]
  5. ])
  6. #观察维度,size,len的区别
  7. print(ary.shape, ary.size, len(ary))

数组元素索引(下标)

数组对象[…, 页号, 行号, 列号]

下标从0开始,到数组len-1结束。

  1. import numpy as np
  2. a = np.array([[[1, 2],
  3. [3, 4]],
  4. [[5, 6],
  5. [7, 8]]])
  6. print(a, a.shape)
  7. print(a[0])
  8. print(a[0][0])
  9. print(a[0][0][0])
  10. print(a[0, 0, 0])
  11. for i in range(a.shape[0]):
  12. for j in range(a.shape[1]):
  13. for k in range(a.shape[2]):
  14. print(a[i, j, k])

ndarray对象属性操作详解

Numpy的内部基本数据类型


































类型名 类型表示符
布尔型 bool
有符号整数型 int8(-128~127)/int16/int32/int64
无符号整数型 uint8(0~255)/uint16/uint32/uint64
浮点型 float16/float32/float64
复数型 complex64/complex128
字串型 str,每个字符用32位Unicode编码表示

自定义复合类型

  1. # 自定义复合类型
  2. import numpy as np
  3. data=[
  4. ('zs', [90, 80, 85], 15),
  5. ('ls', [92, 81, 83], 16),
  6. ('ww', [95, 85, 95], 15)
  7. ]
  8. #第一种设置dtype的方式
  9. a = np.array(data, dtype='U3, 3int32, int32')
  10. print(a)
  11. print(a[0]['f0'], ":", a[1]['f1'])
  12. print("=====================================")
  13. #第二种设置dtype的方式
  14. b = np.array(data, dtype=[('name', 'str_', 2),
  15. ('scores', 'int32', 3),
  16. ('ages', 'int32', 1)])
  17. print(b[0]['name'], ":", b[0]['scores'])
  18. print("=====================================")
  19. #第三种设置dtype的方式
  20. c = np.array(data, dtype={ 'names': ['name', 'scores', 'ages'],
  21. 'formats': ['U3', '3int32', 'int32']})
  22. print(c[0]['name'], ":", c[0]['scores'], ":", c.itemsize)
  23. print("=====================================")
  24. #第四种设置dtype的方式
  25. d = np.array(data, dtype={ 'names': ('U3', 0),
  26. 'scores': ('3int32', 16),
  27. 'ages': ('int32', 28)})
  28. print(d[0]['names'], d[0]['scores'], d.itemsize)
  29. print("=====================================")
  30. #第五种设置dtype的方式
  31. e = np.array([0x1234, 0x5667],
  32. dtype=('u2', { 'lowc': ('u1', 0),
  33. 'hignc': ('u1', 1)}))
  34. print('%x' % e[0])
  35. print('%x %x' % (e['lowc'][0], e['hignc'][0]))
  36. print("=====================================")
  37. #测试日期类型数组
  38. f = np.array(['2011', '2012-01-01', '2013-01-01 01:01:01','2011-02-01'])
  39. f = f.astype('M8[D]')
  40. f = f.astype('int32')
  41. print(f[3]-f[0])
  42. print("=====================================")
  43. a = np.array([[1 + 1j, 2 + 4j, 3 + 7j],
  44. [4 + 2j, 5 + 5j, 6 + 8j],
  45. [7 + 3j, 8 + 6j, 9 + 9j]])
  46. print(a.T)
  47. for x in a.flat:
  48. print(x.imag)

类型字符码






































类型 字符码
np.bool ?
np.int8/16/32/64 i1/i2/i4/i8
np.uint8/16/32/64 u1/u2/u4/u8
np.float/16/32/64 f2/f4/f8
np.complex64/128 c8/c16
np.str U<字符数>
np.datetime64 M8[Y] M8[M] M8[D] M8[h] M8[m] M8[s]

字节序前缀,用于多字节整数和字符串:
</>/[=]分别表示小端/大端/硬件字节序。

类型字符码格式

<字节序前缀><维度><类型><字节数或字符数>






















3i4 释义
3i4 大端字节序,3个元素的一维数组,每个元素都是整型,每个整型元素占4个字节。
<(2,3)u8 小端字节序,6个元素2行3列的二维数组,每个元素都是无符号整型,每个无符号整型元素占8个字节。
U7 包含7个字符的Unicode字符串,每个字符占4个字节,采用默认字节序。
ndarray数组对象的维度操作

视图变维(数据共享): reshape() 与 ravel()

  1. import numpy as np
  2. a = np.arange(1, 9)
  3. print(a) # [1 2 3 4 5 6 7 8]
  4. b = a.reshape(2, 4) #视图变维 : 变为2行4列的二维数组
  5. print(b)
  6. c = b.reshape(2, 2, 2) #视图变维 变为2页2行2列的三维数组
  7. print(c)
  8. d = c.ravel() #视图变维 变为1维数组
  9. print(d)

**复制变维(数据独立):**flatten()

  1. e = c.flatten()
  2. print(e)
  3. a += 10
  4. print(a, e, sep='\n')

就地变维:直接改变原数组对象的维度,不返回新数组

  1. a.shape = (2, 4)
  2. print(a)
  3. a.resize(2, 2, 2)
  4. print(a)
ndarray数组切片操作
  1. #数组对象切片的参数设置与列表切面参数类似
  2. # 步长+:默认切从首到尾
  3. # 步长-:默认切从尾到首
  4. 数组对象[起始位置:终止位置:步长, ...]
  5. #默认位置步长:1
  6. import numpy as np
  7. a = np.arange(1, 10)
  8. print(a) # 1 2 3 4 5 6 7 8 9
  9. print(a[:3]) # 1 2 3
  10. print(a[3:6]) # 4 5 6
  11. print(a[6:]) # 7 8 9
  12. print(a[::-1]) # 9 8 7 6 5 4 3 2 1
  13. print(a[:-4:-1]) # 9 8 7
  14. print(a[-4:-7:-1]) # 6 5 4
  15. print(a[-7::-1]) # 3 2 1
  16. print(a[::]) # 1 2 3 4 5 6 7 8 9
  17. print(a[:]) # 1 2 3 4 5 6 7 8 9
  18. print(a[::3]) # 1 4 7
  19. print(a[1::3]) # 2 5 8
  20. print(a[2::3]) # 3 6 9

多维数组的切片操作

  1. import numpy as np
  2. a = np.arange(1, 28)
  3. a.resize(3,3,3)
  4. print(a)
  5. #切出1页
  6. print(a[1, :, :])
  7. #切出所有页的1行
  8. print(a[:, 1, :])
  9. #切出0页的1行1列
  10. print(a[0, :, 1])
ndarray数组的掩码操作
  1. import numpy as np
  2. a = np.arange(1, 10)
  3. mask = [True, False,True, False,True, False,True, False,True, False]
  4. print(a[mask])
多维数组的组合与拆分

垂直方向操作:

  1. import numpy as np
  2. a = np.arange(1, 7).reshape(2, 3)
  3. b = np.arange(7, 13).reshape(2, 3)
  4. # 垂直方向完成组合操作,生成新数组
  5. c = np.vstack((a, b))
  6. # 垂直方向完成拆分操作,生成两个数组
  7. d, e = np.vsplit(c, 2)

水平方向操作:

  1. import numpy as np
  2. a = np.arange(1, 7).reshape(2, 3)
  3. b = np.arange(7, 13).reshape(2, 3)
  4. # 水平方向完成组合操作,生成新数组
  5. c = np.hstack((a, b))
  6. # 水平方向完成拆分操作,生成两个数组
  7. d, e = np.hsplit(c, 2)

长度不等的数组组合:

  1. import numpy as np
  2. a = np.array([1,2,3,4,5])
  3. b = np.array([1,2,3,4])
  4. # 填充b数组使其长度与a相同
  5. b = np.pad(b, pad_width=(0, 1), mode='constant', constant_values=-1)
  6. print(b)
  7. # 垂直方向完成组合操作,生成新数组
  8. c = np.vstack((a, b))
  9. print(c)

深度方向操作:(3维)

  1. import numpy as np
  2. a = np.arange(1, 7).reshape(2, 3)
  3. b = np.arange(7, 13).reshape(2, 3)
  4. # 深度方向(3维)完成组合操作,生成新数组
  5. i = np.dstack((a, b))
  6. # 深度方向(3维)完成拆分操作,生成两个数组
  7. k, l = np.dsplit(i, 2)

多维数组组合与拆分的相关函数:

  1. # 通过axis作为关键字参数指定组合的方向,取值如下:
  2. # 若待组合的数组都是二维数组:
  3. # 0: 垂直方向组合
  4. # 1: 水平方向组合
  5. # 若待组合的数组都是三维数组:
  6. # 0: 垂直方向组合
  7. # 1: 水平方向组合
  8. # 2: 深度方向组合
  9. np.concatenate((a, b), axis=0)
  10. # 通过给出的数组与要拆分的份数,按照某个方向进行拆分,axis的取值同上
  11. np.split(c, 2, axis=0)

简单的一维数组组合方案

  1. a = np.arange(1,9) #[1, 2, 3, 4, 5, 6, 7, 8]
  2. b = np.arange(9,17) #[9,10,11,12,13,14,15,16]
  3. #把两个数组摞在一起成两行
  4. c = np.row_stack((a, b))
  5. print(c)
  6. #把两个数组组合在一起成两列
  7. d = np.column_stack((a, b))
  8. print(d)

ndarray类的其他属性

  • shape - 维度
  • dtype - 元素类型
  • size - 元素数量
  • ndim - 维数,len(shape)
  • itemsize - 元素字节数
  • nbytes - 总字节数 = size * itemsize
  • real - 复数数组的实部数组
  • imag - 复数数组的虚部数组
  • T - 数组对象的转置视图
  • flat - 扁平迭代器

    import numpy as np
    a = np.array([[1 + 1j, 2 + 4j, 3 + 7j],

    1. [4 + 2j, 5 + 5j, 6 + 8j],
    2. [7 + 3j, 8 + 6j, 9 + 9j]])

    print(a.shape)
    print(a.dtype)
    print(a.ndim)
    print(a.size)
    print(a.itemsize)
    print(a.nbytes)
    print(a.real, a.imag, sep=’\n’)
    print(a.T)
    print([elem for elem in a.flat])
    b = a.tolist()
    print(b)

金融相关

  1. import numpy as np
  2. # 终值 = np.fv(利率, 期数, 每期支付, 现值)
  3. # 将1000元以1%的年利率存入银行5年,每年加存100元,
  4. # 到期后本息合计多少钱?
  5. fv = np.fv(0.01, 5, -100, -1000)
  6. print(round(fv, 2))
  7. # 现值 = np.pv(利率, 期数, 每期支付, 终值)
  8. # 将多少钱以1%的年利率存入银行5年,每年加存100元,
  9. # 到期后本息合计fv元?
  10. pv = np.pv(0.01, 5, -100, fv)
  11. print(pv)
  12. # 净现值 = np.npv(利率, 现金流)
  13. # 将1000元以1%的年利率存入银行5年,每年加存100元,
  14. # 相当于一次性存入多少钱?
  15. npv = np.npv(0.01, [
  16. -1000, -100, -100, -100, -100, -100])
  17. print(round(npv, 2))
  18. fv = np.fv(0.01, 5, 0, npv)
  19. print(round(fv, 2))
  20. # 内部收益率 = np.irr(现金流)
  21. # 将1000元存入银行5年,以后逐年提现100元、200元、
  22. # 300元、400元、500元,银行利率达到多少,可在最后
  23. # 一次提现后偿清全部本息,即净现值为0元?
  24. irr = np.irr([-1000, 100, 200, 300, 400, 500])
  25. print(round(irr, 2))
  26. npv = np.npv(irr, [-1000, 100, 200, 300, 400, 500])
  27. print(npv)
  28. # 每期支付 = np.pmt(利率, 期数, 现值)
  29. # 以1%的年利率从银行贷款1000元,分5年还清,
  30. # 平均每年还多少钱?
  31. pmt = np.pmt(0.01, 5, 1000)
  32. print(round(pmt, 2))
  33. # 期数 = np.nper(利率, 每期支付, 现值)
  34. # 以1%的年利率从银行贷款1000元,平均每年还pmt元,
  35. # 多少年还清?
  36. nper = np.nper(0.01, pmt, 1000)
  37. print(int(nper))
  38. # 利率 = np.rate(期数, 每期支付, 现值, 终值)
  39. # 从银行贷款1000元,平均每年还pmt元,nper年还清,
  40. # 年利率多少?
  41. rate = np.rate(nper, pmt, 1000, 0)
  42. print(round(rate, 2))

发表评论

表情:
评论列表 (有 0 条评论,77人围观)

还没有评论,来说两句吧...

相关阅读

    相关 numpy基本操作

    numpy概述 1. Numerical Python,数值的Python,补充了Python语言所欠缺的数值计算能力。 2. Numpy是其它数据分析及机器学习库的