numpy学习笔记——读懂官方文档
1. 安装方法
pycharm-file-setting-project interpreter-选择‘+’-搜索numpy
2. 基本功能
>>> import numpy as np >>> a = np.arange(15).reshape(3, 5) # arange需要整理的数据集大小 reshape整理成几行几列 >>> a array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) # 输入a,直接整理成从0递增的三行五列数据 >>> a.shape # a的格式 三行五列 (3, 5) >>> a.ndim # a的维数 2 2 >>> a.dtype.name #dtype表示数组a内元素类型 'int64' >>> a.itemsize # 数组中每个元素占几位 8 8 >>> a.size # a的大小 15 15
3. 构造数组
(1)使用array函数
# 生成一维数组 >>> a = np.array([2,3,4]) >>> a array([2, 3, 4]) # 生成二维数组,注意中括号和小括号 >>> b = np.array([(1.5,2,3), (4,5,6)]) >>> b array([[ 1.5, 2. , 3. ], [ 4. , 5. , 6. ]]) # 生成复杂数组,类型提前声明,注意括号 >>> c = np.array( [ [1,2], [3,4] ], dtype=complex ) >>> c array([[ 1.+0.j, 2.+0.j], [ 3.+0.j, 4.+0.j]])
(2)生成零数组zeros,一数组ones,空数组empty
>>> np.zeros( (3,4) )
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
(3)arange生成数字序列
# 顺序递增序列 d = np.arange(15) d array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) #开始10,结束30,步长5 #注意:不包括30 >>> np.arange( 10, 30, 5 ) array([10, 15, 20, 25])
(4)linspace
# 0-2之间均匀找9个数,包括0和2 >>> np.linspace( 0, 2, 9 ) array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
(5)使用函数
>>> x = np.linspace( 0, 2*3.14, 10 ) >>> x array([ 1. , 1.58666667, 2.17333333, 2.76 , 3.34666667, 3.93333333, 4.52 , 5.10666667, 5.69333333, 6.28 ]) >>>np.sin(x) array([ 0.84147098, 0.99987407, 0.82390046, 0.37239904, -0.20363962, -0.71157736, -0.98155025, -0.92327428, -0.55623802, -0.0031853 ])
(6)随机数 random
>>> np.random.rand(3,2) array([[ 0.14022471, 0.96360618], [ 0.37601032, 0.25528411], [ 0.49313049, 0.94909878]])
4. 数组的输出
# 三维数组的输出 >>> c = np.arange(24).reshape(2,3,4)
# reshape的理解:第3个维度是4,里面有4个数据;
第2个维度是3,里面有3个包含4个数据的数组
第1个维度是2,里面有2个三行四列的矩阵
>>> print(c) [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]]
5. 主要操作
(1)点乘和叉乘
>>> A = np.array( [[1,1], ... [0,1]] ) >>> B = np.array( [[2,0], ... [3,4]] ) # 对应元素直接相乘 >>> A*B array([[2, 0], [0, 4]]) # 矩阵乘法 >>> A.dot(B) array([[5, 4], [3, 4]]) >>> np.dot(A, B) array([[5, 4], [3, 4]])
(2)求最大max、最小min、求和sum,
在整个数组范围中求
>>> a = np.random.random((2,3)) >>> a array([[ 0.18626021, 0.34556073, 0.39676747], [ 0.53881673, 0.41919451, 0.6852195 ]]) >>> a.sum() 2.5718191614547998 >>> a.min() 0.1862602113776709 >>> a.max() 0.6852195003967595
在某个维度求和
>>> b = np.arange(12).reshape(3,4) >>> b array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> b.sum(axis=0) # 对列求和 array([12, 15, 18, 21]) >>> b.min(axis=1) # 对行求和 array([0, 4, 8]) >>> b.cumsum(axis=1) # 每行逐次求和 array([[ 0, 1, 3, 6], [ 4, 9, 15, 22], [ 8, 17, 27, 38]])
6. 常用函数
aqrt、exp、sort...
7. 索引、切片、正则化
多维操作和一维操作相似
>>> def f(x,y): ... return 10*x+y ... >>> b = np.fromfunction(f,(5,4),dtype=int) >>> b array([[ 0, 1, 2, 3], [10, 11, 12, 13], [20, 21, 22, 23], [30, 31, 32, 33], [40, 41, 42, 43]]) # 输出第2行,第3列的数 >>> b[2,3] 23 # 输出第0-5行(不包括第5行),第1列的数 >>> b[0:5, 1] array([ 1, 11, 21, 31, 41]) # 输出所有行,第1列的数 # :表示所有 >>> b[ : ,1] array([ 1, 11, 21, 31, 41]) # 输出1-3行(不包括第3行),所有数 >>> b[1:3, : ] array([[10, 11, 12, 13], [20, 21, 22, 23]])
# 输出最后一行
>>> b[-1]
array([40, 41, 42, 43])
...的用法
>>> c = np.array( [[[ 0, 1, 2], # c是三维数组 ... [ 10, 12, 13]], ... [[100,101,102], ... [110,112,113]]]) >>> c.shape (2, 2, 3) >>> c[1,...] # 相当于 c[1,:,:] or c[1] array([[100, 101, 102], [110, 112, 113]]) >>> c[...,2] # 相当于 c[:,:,2] array([[ 2, 13], [102, 113]])
对行操作和对单个元素操作flat
# 对行进行操作 >>> for row in b: ... print(row) ... [0 1 2 3] [10 11 12 13] [20 21 22 23] [30 31 32 33] [40 41 42 43] # 对每个元素进行操作 >>> for element in b.flat: ... print(element) ... 0 1 2 3 10 11 12 13 20 21 22 23 30 31 32 33 40 41 42 43
8. 矩阵形状操作
shape
ravel
>>> a = np.floor(10*np.random.random((3,4))) >>> a array([[ 2., 8., 0., 6.], [ 4., 5., 1., 1.], [ 8., 9., 3., 6.]]) >>> a.shape (3, 4) >>> a.ravel() # 拉成一维的了 array([ 2., 8., 0., 6., 4., 5., 1., 1., 8., 9., 3., 6.]) >>> a.reshape(6,2) # 重新设定形状 若把2改为-1,则会自动计算 array([[ 2., 8.], [ 0., 6.], [ 4., 5.], [ 1., 1.], [ 8., 9.], [ 3., 6.]])
转置T
>>> a.T array([[ 2., 4., 8.], [ 8., 5., 9.], [ 0., 1., 3.], [ 6., 1., 6.]])
9.矩阵堆叠
多维操作时,hstack沿着第二维堆叠,vstack沿着第一维堆叠,
并且有可选参数来控制沿着哪个维度堆叠。
>>> a = np.floor(10*np.random.random((2,2))) >>> a array([[ 8., 8.], [ 0., 0.]]) >>> b = np.floor(10*np.random.random((2,2))) >>> b array([[ 1., 8.], [ 0., 4.]]) # 竖着堆 >>> np.vstack((a,b)) array([[ 8., 8.], [ 0., 0.], [ 1., 8.], [ 0., 4.]]) #横着堆 >>> np.hstack((a,b)) array([[ 8., 8., 1., 8.], [ 0., 0., 0., 4.]])
函数 column_stack
直接使用:
>>> np.r_[1:4,0,4]
array([1, 2, 3, 0, 4])
10. 分割数组
横向数着切hsplit、纵向数着切vsplit
>>> a = np.floor(10*np.random.random((2,12))) >>> a array([[ 9., 5., 6., 3., 6., 8., 0., 7., 9., 7., 2., 7.], [ 1., 4., 9., 2., 2., 1., 0., 6., 2., 2., 4., 0.]]) >>> np.hsplit(a,3) # 切成三个数组 [array([[ 9., 5., 6., 3.], [ 1., 4., 9., 2.]]), array([[ 6., 8., 0., 7.], [ 2., 1., 0., 6.]]), array([[ 9., 7., 2., 7.], [ 2., 2., 4., 0.]])] >>> np.hsplit(a,(3,4)) # 第三列和第四列后面切一刀 [array([[ 9., 5., 6.], [ 1., 4., 9.]]), array([[ 3.], [ 2.]]), array([[ 6., 8., 0., 7., 9., 7., 2., 7.], [ 2., 1., 0., 6., 2., 2., 4., 0.]])]
11.拷贝
操作数组时,有时候拷贝了副本,有时候没有,如何区分这些情况。
(1)不拷贝
简单的赋值
函数调用
(2)浅拷贝
view生成一个数据相同的新数组。
>>> c = a.view() >>> c is a # c和a是同一个数组 False >>> c.base is a #c是a持有数据的镜像 True >>> c.flags.owndata False >>> c.shape = 2,6 # 改变c的形状,a的形状没变 >>> a.shape (3, 4) >>> c[0,4] = 1234 #改变c的数据,a的数据改变 >>> a array([[ 0, 1, 2, 3], [1234, 5, 6, 7], [ 8, 9, 10, 11]])
数据切片后返回浅拷贝,原始数据不受损
(3)深拷贝
copy完全拷贝数组和数据
>>> d = a.copy() >>> d is a False >>> d.base is a # d和a没有关系 False
12. 索引
>>> a = np.arange(12)**2 >>> i = np.array( [ 1,1,3,8,5 ] ) >>> a[i] # 输出的是数组a中第i个位置中的数 array([ 1, 1, 9, 64, 25])
若a是多维的,则索引指向它的第一维
索引可以是多维的,索引的每一维必须形状相同
利用索引来选择数组
>>> a = np.arange(12).reshape(3,4) >>> b1 = np.array([False,True,True]) >>> b2 = np.array([True,False,True,False]) # 选择行 >>> a[b1,:] array([[ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> a[b1] array([[ 4, 5, 6, 7], [ 8, 9, 10, 11]]) # 选择列 >>> a[:,b2] array([[ 0, 2], [ 4, 6], [ 8, 10]]) # 选择行列 >>> a[b1,b2] array([ 4, 10])
ix_()函数 为了方便计算使用
可以为了获得多元组的结果而用来结合不同向量。例如,如果你想要用所有向量a、b和c元素组成的三元组来计算a+b*c
:
>>> a = np.array([2,3,4,5]) >>> b = np.array([8,5,4]) >>> c = np.array([5,4,6,8,3]) >>> ax,bx,cx = np.ix_(a,b,c) >>> ax array([[[2]], [[3]], [[4]], [[5]]]) >>> bx array([[[8], [5], [4]]]) >>> cx array([[[5, 4, 6, 8, 3]]]) >>> ax.shape, bx.shape, cx.shape ((4, 1, 1), (1, 3, 1), (1, 1, 5)) >>> result = ax+bx*cx >>> result array([[[42, 34, 50, 66, 26], [27, 22, 32, 42, 17], [22, 18, 26, 34, 14]], [[43, 35, 51, 67, 27], [28, 23, 33, 43, 18], [23, 19, 27, 35, 15]], [[44, 36, 52, 68, 28], [29, 24, 34, 44, 19], [24, 20, 28, 36, 16]], [[45, 37, 53, 69, 29], [30, 25, 35, 45, 20], [25, 21, 29, 37, 17]]]) >>> result[3,2,4] 17 >>> a[3]+b[2]*c[4] 17
13. 线性代数
>>> import numpy as np >>> a = np.array([[1.0, 2.0], [3.0, 4.0]]) >>> print(a) [[ 1. 2.] [ 3. 4.]] >>> a.transpose() # 转置 array([[ 1., 3.], [ 2., 4.]]) >>> np.linalg.inv(a) # 取反 array([[-2. , 1. ], [ 1.5, -0.5]]) >>> u = np.eye(2) # 单位阵 >>> u array([[ 1., 0.], [ 0., 1.]]) >>> j = np.array([[0.0, -1.0], [1.0, 0.0]]) >>> np.dot (j, j) # 矩阵间相乘 array([[-1., 0.], [ 0., -1.]]) >>> y = np.array([[5.], [7.]]) >>> np.linalg.solve(a, y) # 解方程 array([[-3.], [ 4.]])
14. 直方图
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> mu, sigma = 2, 0.5 >>> v = np.random.normal(mu,sigma,10000) >>> plt.hist(v, bins=50, normed=1) >>> plt.show()