NumPy是高性能科学计算和数据分析的基础包。它是pandas等其他各种工具的基础.
NumPy的主要功能:
- ndarray,一个多维数组结构,高效且节省空间
- 无需循环对整组数据进行快速运算的数学函数
- *读写磁盘数据的工具以及用于操作内存映射文件的工具
- *线性代数、随机数生成和傅里叶变换功能
- *用于集成C、C++等代码的工具
安装方法:pip install numpy
引用方式:import numpy as np
NumPy的主要对象是同质多维数组。它是一张表,所有元素(通常是数字)的类型都相同,并通过正整数元组索引.NumPy的数组的类称为ndarray
。别名为array
。
创建ndarray:
- array() 将列表转换为数组,可选择显式指定dtype
In [17]: import numpy as npIn [18]: a = np.array([2,3,4])In [19]: aOut[19]: array([2, 3, 4])
- arange() range的numpy版,支持浮点数
In [21]: a = np.arange(10,30,5)##(10 ,30 是指定范围,5步长,步长支持小数)In [22]: aOut[22]: array([10, 15, 20, 25])In [23]: a = np.arange(10,30,0.5)In [24]: aOut[24]: array([ 10. , 10.5, 11. , 11.5, 12. , 12.5, 13. , 13.5, 14. , 14.5, 15. , 15.5, 16. , 16.5, 17. , 17.5, 18. , 18.5, 19. , 19.5, 20. , 20.5, 21. , 21.5, 22. , 22.5, 23. , 23.5, 24. , 24.5, 25. , 25.5, 26. , 26.5, 27. , 27.5, 28. , 28.5, 29. , 29.5])
- linspace() 类似arange(),第三个参数为数组长度
-
In [25]: a = np.linspace(0,2,9)## 将【0,2】分成九份In [26]: aOut[26]: array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
- zeros() 根据指定形状和dtype创建全0数组
In [28]: a = np.zeros((3,2),dtype=np.int64)#第一个参数是元祖,表明创建个几行几列的数据 # dtype 表示数据类型In [29]: aOut[29]: array([[0, 0], [0, 0], [0, 0]])
- ones() 根据指定形状和dtype创建全1数组
- empty() 根据指定形状和dtype创建空数组(随机值)(函数
empty
内容是随机的并且取决于存储器的状态。默认情况下,创建的数组的dtype为float64
。) - eye() 根据指定边长和dtype创建单位矩阵
ndarray基本属性:
- ndarray.ndim
- 数组的轴(维度)的个数。在Python世界中,维度的数量被称为rank。 ndarray.shape
- 数组的维度。这是一个整数的元组,表示每个维度中数组的大小。对于具有n行和m列的矩阵,
shape
将是(n,m)
。因此,shape
元组的长度就是rank或维度的个数ndim
。 ndarray.size - 数组元素的总数。这等于
shape
的元素的乘积。 ndarray.dtype - 描述数组中元素类型的对象。可以使用标准Python类型创建或指定dtype。另外NumPy提供了自己的类型。例如numpy.int32、numpy.int16和numpy.float64。 ndarray.itemsize
- 数组中每个元素的字节大小。例如,元素为
float64
类型的数组的itemsize
为8(=64/8),而complex32
类型的数组的comitemsize
为4(=32/8)。它等于ndarray.dtype.itemsize
。 ndarray.data - 该缓冲区包含数组的实际元素。通常,我们不需要使用此属性,因为我们将使用索引访问数组中的元素。
数组和标量之间的运算
a+1 a*3 1//a a**0.5
同样大小数组之间的运算
In [30]: a = np.array([20,30,40,50])In [31]: b = np.arange(4)In [32]: aOut[32]: array([20, 30, 40, 50])In [33]: bOut[33]: array([0, 1, 2, 3])In [34]: c = a - bIn [35]: cOut[35]: array([20, 29, 38, 47])
乘法运算符*
的运算在NumPy数组中是元素级别的。
可以使用dot
函数或方法执行矩阵乘积:
In [36]: aOut[36]: array([20, 30, 40, 50])In [37]: bOut[37]: array([0, 1, 2, 3])In [38]: a*bOut[38]: array([ 0, 30, 80, 150])
In [39]: a.dot(b)
Out[39]: 260
###矩阵乘法复习:
默认情况下,这些操作适用于数组,就像它是一个数字列表,而不管其形状。但是,通过指定axis
参数,你可以沿着数组的指定轴应用操作:
>>> b = np.arange(12).reshape(3,4)>>> barray([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])>>>>>> b.sum(axis=0) # sum of each columnarray([12, 15, 18, 21])>>>>>> b.min(axis=1) # min of each rowarray([0, 4, 8])>>>>>> b.cumsum(axis=1) # cumulative sum along each row(每个数和这个数之前所有数的和)array([[ 0, 1, 3, 6], [ 4, 9, 15, 22], [ 8, 17, 27, 38]])
通用函数:能同时对数组中所有元素进行运算的函数
常见通用函数:
- 一元函数:abs(绝对值), sqrt(平方), exp, log, ceil, floor, rint, trunc, modf, isnan(判断是否是nan), isinf(判断是否是inf), cos, sin, tan
- 二元函数:add, substract, multiply, divide, power, mod, maximum, mininum,
索引、切片和迭代:
一维数组索引:(和列表几乎差不多)
In [49]: aOut[49]: array([20, 30, 40, 50])In [50]: a[1]Out[50]: 30
二维/多维数组索引
In [51]: bOut[51]: array([[ 1, 2, 3, 4], [10, 11, 12, 13]])In [52]: b[1][2]Out[52]: 12In [53]: b[1,2]. #推荐这种Out[53]: 12
布尔型索引:将同样大小的布尔数组传进索引,会返回一个由所有True对应位置的元素的数组
In [59]: bOut[59]: array([[ 1, 2, 3, 4], [10, 11, 12, 13]])In [60]: b<5Out[60]: array([[ True, True, True, True], [False, False, False, False]], dtype=bool)In [61]: b[b<5]Out[61]: array([1, 2, 3, 4])
花式索引:(索引的值也是索引)
例:对一个二维数组,选出其第一列和第三列,组成新的二维数组。
In [64]: bOut[64]: array([[ 1, 2, 3, 4], [10, 11, 12, 13]])In [65]: c = b[:,[1,3]] ##(里面的【1,3】指的是第1和3列)In [66]: cOut[66]: array([[ 2, 4], [11, 13]])
切片:
In [67]: aOut[67]: array([20, 30, 40, 50])In [68]: a[1:3]Out[68]: array([30, 40])In [71]: b = np.arange(20).reshape(4,5)In [72]: bOut[72]: array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]])In [73]: b[1:3]Out[73]: array([[ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
与列表不同,数组切片时并不会自动复制,在切片数组上的修改会影响原数组。 【解决方法:copy()】
In [74]: aOut[74]: array([20, 30, 40, 50])In [75]: c = a[1:3]In [76]: cOut[76]: array([30, 40])In [77]: c[0] = 11In [78]: cOut[78]: array([11, 40])In [79]: aOut[79]: array([20, 11, 40, 50])In [80]: c = a[1:3].copy()In [82]: cOut[82]: array([11, 40])In [83]: c[0] = 99In [84]: cOut[84]: array([99, 40])In [85]: aOut[85]: array([20, 11, 40, 50])
In [122]: b
Out[122]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
In [123]: c = b[1:3,1:3]
In [124]: c
Out[124]:
array([[ 6, 7],
[11, 12]])
常用函数:
- sum 求和
- mean 求平均数
- std 求标准差
- var 求方差
- min 求最小值
- max 求最大值
- argmin 求最小值索引
- argmax 求最大值索引
- rand 给定形状产生随机数组(0到1之间的数)
- randint 给定形状产生随机整数
- choice 给定形状产生随机选择
- shuffle 与random.shuffle相同(重新洗牌,随机打乱)
- uniform 给定形状产生随机数组