>>> import numpy as np #导入numpy
array 的基本操作
arange
>>> a = np.arange(1,15) #返回从1到15的array >>> a array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) >>> >>> a = np.arange(15) #返回从0到14的array >>> >>> a array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) >>> >>> a = np.arange(1,15) #返回从1到14的array >>> a array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) >>>
>>> a = np.arange(10,40,5) #创建array,值为10到40之间,间隔为5
>>> a
array([10, 15, 20, 25, 30, 35])
>>> a = np.arange(0,2,0.3)
>>> a
array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
reshape
>>> b = np.reshape(a,(3,5)) #将数据的数据变为3行5列的array Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 225, in reshape return reshape(newshape, order=order) ValueError: total size of new array must be unchanged
为什么会出错呢? 因为 a 只有14个元素,不够分
>>> a = np.arange(0,15) #返回从1到14的array >>> >>> b = np.reshape(a,(3,5)) #将数据的数据变为3行5列的array >>> b array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) >>>
shape, ndim, size, type
>>> b.shape #返回几行几列 (3, 5) >>> b.ndim #返回维度 2 >>> b.dtype.name #数据类型 'int64' >>> b.size #array大小 15 >>> type(b) #b的类型 <type 'numpy.ndarray'>
从list生成 array
>>> a = np.array([2,3,4]) #从list生成array >>> a array([2, 3, 4]) >>> b = np.array([(1,2,3),(4,5,6)])#从list生成2维array >>> b array([[1, 2, 3], [4, 5, 6]]) >>> c = np.array([[1,2,3],[1,2,3]]) >>> c array([[1, 2, 3], [1, 2, 3]])
通过numpy 内建函数初始化 array
>>> a = np.zeros((3,4)) #创建3行4列的全0 array >>> >>> a = np.zeros((3,4)) #创建3行4列的全0 array,注意有两层括号 >>> a array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]]) >>> a = np.ones((3,4)) #创建3行4列的全1 array >>> a array([[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]])
数组运算
>>> a = np.array([20,30,40,50]) >>> a array([20, 30, 40, 50]) >>> b = np.arange(4) >>> b array([0, 1, 2, 3]) >>> c = a-b >>> c array([20, 29, 38, 47]) >>> c = a-b #相减 >>> c array([20, 29, 38, 47]) >>> b**2 array([0, 1, 4, 9]) >>> b**2 #每个元素的平方 array([0, 1, 4, 9]) >>> 10*np.sin(a) array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854]) >>> a<35 array([ True, True, False, False], dtype=bool) >>> a*b #对应位置元素相乘 array([ 0, 30, 80, 150]) >>> a.dot(b) 260 >>> a.dot(b) #矩阵乘法 260 >>> np.dot(a,b) 260
数组运算内建函数
>>> a = np.array([[1,2,3],[4,5,6]]) >>> a array([[1, 2, 3], [4, 5, 6]]) >>> a.sum() 21 >>> a.sum(axis=1) #每行的和 array([ 6, 15]) >>> a.sum(axis=0) #每列的和 array([5, 7, 9])
>>> a.max()
6
>>> a.min()
1
Shape操作
>>> a = np.floor(10*np.random.random((3,4))) #注意:floor是向下取整 >>> a array([[ 3., 9., 6., 7.], [ 8., 8., 6., 8.], [ 4., 4., 5., 3.]]) >>> a.shape (3, 4) >>> >>> a.ravel() #把array变成一个向量 array([ 3., 9., 6., 7., 8., 8., 6., 8., 4., 4., 5., 3.]) >>> a.reshape(6,2) array([[ 3., 9.], [ 6., 7.], [ 8., 8.], [ 6., 8.], [ 4., 4.], [ 5., 3.]]) >>> a.T #a的转置 array([[ 3., 8., 4.], [ 9., 8., 4.], [ 6., 6., 5.], [ 7., 8., 3.]]) >>> a.T.shape (4, 3) >>> a.shape (3, 4) >>> a.resize((2,6)) #注意resize和reshape的区别就是,resize会改变a本身,reshape不会 >>> a array([[ 3., 9., 6., 7., 8., 8.], [ 6., 8., 4., 4., 5., 3.]]) >>> a.reshape(3,-1) #-1表示这一维自动计算 array([[ 3., 9., 6., 7.], [ 8., 8., 6., 8.], [ 4., 4., 5., 3.]]) >>>
拼接
>>> a = np.array([[1,2],[3,4]]) >>> a array([[1, 2], [3, 4]]) >>> b = np.array([[5,6],[7,8]]) >>> b array([[5, 6], [7, 8]]) >>> np.vstack((a,b)) #把b放在a下面 array([[1, 2], [3, 4], [5, 6], [7, 8]]) >>> np.hstack((a,b)) #把b放在a右边 array([[1, 2, 5, 6], [3, 4, 7, 8]])
切分
>>> a = np.floor(10*np.random.random((2,12))) >>> >>> a array([[ 4., 2., 8., 8., 6., 2., 5., 3., 4., 7., 1., 9.], [ 4., 4., 9., 8., 0., 1., 2., 1., 3., 6., 7., 2.]]) >>> >>> np.hsplit(a,3) #把a横向分为3份 [array([[ 4., 2., 8., 8.], [ 4., 4., 9., 8.]]), array([[ 6., 2., 5., 3.], [ 0., 1., 2., 1.]]), array([[ 4., 7., 1., 9.], [ 3., 6., 7., 2.]])] >>> np.vsplit(a.T,3) #纵向分 [array([[ 4., 4.], [ 2., 4.], [ 8., 9.], [ 8., 8.]]), array([[ 6., 0.], [ 2., 1.], [ 5., 2.], [ 3., 1.]]), array([[ 4., 3.], [ 7., 6.], [ 1., 7.], [ 9., 2.]])] >>>
零散笔记
表示array中的特定几行
>>> h array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47, 48, 49], [50, 51, 52, 53, 54, 55, 56, 57, 58, 59]]) >>> mask = range(5) >>> mask [0, 1, 2, 3, 4] >>> h[mask] #取 h 的0,1,2,3,4行 array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47, 48, 49]]) >>> >>> mask = range(2,5) >>> mask [2, 3, 4] >>> h[mask] #取 h 的 2,3,4 行 array([[20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47, 48, 49]])
均值
>>> np.mean(h,axis=0) #每一列的均值 array([ 25., 26., 27., 28., 29., 30., 31., 32., 33., 34.]) >>> np.mean(h,axis=1) #每一行的均值 array([ 4.5, 14.5, 24.5, 34.5, 44.5, 54.5])
随机数
>>> w = np.random.randn(3073, 10) #生成一个随机数矩阵,随机数值在(0,1)之间,符合均匀分布 >>> w array([[ 0.67549354, 0.90033156, -0.17879922, ..., 0.73086887, -1.36429038, -0.84239665], [ 0.63798799, -0.49243242, -0.77956457, ..., 1.13186242, -0.88691027, -0.59729021], [ 0.5981941 , 1.0869356 , -0.52344575, ..., 0.51742916, -1.35772943, 0.31620054], ..., [-0.23798699, 0.4268321 , 1.30880808, ..., -0.26957533, 1.40720518, 1.37996847], [ 0.24834546, -1.16090435, 1.93973511, ..., 0.68083319, -0.7405012 , -0.45362532], [ 0.87408501, 2.2738675 , -0.14890794, ..., 0.41797693, -1.7666044 , 1.33517877]]) >>> w.shape[0]
3073
>>> w.shape[1]
10
向量和数组的大小
>>> a = np.array([11,31,32,44]) >>> a.shape #注意返回值其实是向量的长度 (4,) >>> y array([[3], [4], [5]]) >>> y.shape #返回值是矩阵行数和列数 (3, 1)
矩阵减向量
>>> h array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47, 48, 49], [50, 51, 52, 53, 54, 55, 56, 57, 58, 59]]) >>> a array([[ 0], [10], [20], [30], [40], [50]]) >>> h-a #矩阵减向量,相当于把向量每行扩展成矩阵宽度大小 array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
用向量索引array
>>> y = np.arange(6) >>> y array([0, 1, 2, 3, 4, 5]) >>> h = np.arange(60).reshape(6,-1) >>> h array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47, 48, 49], [50, 51, 52, 53, 54, 55, 56, 57, 58, 59]]) >>> h[range(6),y] #取 h 数组中(0,0),(1,1),(2,2),(3,3),(4,4),(5,5)元素 array([ 0, 11, 22, 33, 44, 55]) >>> h[range(6),y]=0 #设置对角线上的元素为0 >>> h array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 0, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 0, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 0, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 0, 45, 46, 47, 48, 49], [50, 51, 52, 53, 54, 0, 56, 57, 58, 59]]) >>> y = y.reshape(-1,1) >>> >>> y array([[0], [1], [2], [3], [4], [5]]) >>> h[range(6),y]=1 #将0-5行0-5列的所有元素都置为1 >>> h array([[ 1, 1, 1, 1, 1, 1, 6, 7, 8, 9], [ 1, 1, 1, 1, 1, 1, 16, 17, 18, 19], [ 1, 1, 1, 1, 1, 1, 26, 27, 28, 29], [ 1, 1, 1, 1, 1, 1, 36, 37, 38, 39], [ 1, 1, 1, 1, 1, 1, 46, 47, 48, 49], [ 1, 1, 1, 1, 1, 1, 56, 57, 58, 59]])
array 乘法
>>> h array([[ 1, 1, 1, 1, 1, 1, 6, 7, 8, 9], [ 1, 1, 1, 1, 1, 1, 16, 17, 18, 19], [ 1, 1, 1, 1, 1, 1, 26, 27, 28, 29], [ 1, 1, 1, 1, 1, 1, 36, 37, 38, 39], [ 1, 1, 1, 1, 1, 1, 46, 47, 48, 49], [ 1, 1, 1, 1, 1, 1, 56, 57, 58, 59]]) >>> h=(h>1)*h #小于1的都为0,大于1的不变 >>> h array([[ 0, 0, 0, 0, 0, 0, 6, 7, 8, 9], [ 0, 0, 0, 0, 0, 0, 16, 17, 18, 19], [ 0, 0, 0, 0, 0, 0, 26, 27, 28, 29], [ 0, 0, 0, 0, 0, 0, 36, 37, 38, 39], [ 0, 0, 0, 0, 0, 0, 46, 47, 48, 49], [ 0, 0, 0, 0, 0, 0, 56, 57, 58, 59]])
求和
>>> c array([[0, 0, 0, 0, 0, 0, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1]]) >>> np.sum(c,axis=1) #每行之和 array([4, 4, 4, 4, 4, 4]) >>> np.sum(c,axis=0) #每列之和 array([0, 0, 0, 0, 0, 0, 6, 6, 6, 6])
最大值最小值的索引
>>> h array([[ 0, 0, 0, 0, 0, 0, 6, 7, 8, 9], [ 0, 0, 0, 0, 0, 0, 16, 17, 18, 19], [ 0, 0, 0, 0, 0, 0, 26, 27, 28, 29], [ 0, 0, 0, 0, 0, 0, 36, 37, 38, 39], [ 0, 0, 0, 0, 0, 0, 46, 47, 48, 49], [ 0, 0, 0, 0, 0, 0, 56, 57, 58, 59]]) >>> h.max(axis=0) array([ 0, 0, 0, 0, 0, 0, 56, 57, 58, 59]) >>> h.max(axis=0) #每列的最大值 array([ 0, 0, 0, 0, 0, 0, 56, 57, 58, 59]) >>> h.min(axis=1) #每行的最大值 >>> np.argmax(h,axis=0) #每列的最大值的索引 array([0, 0, 0, 0, 0, 0, 5, 5, 5, 5]) >>> np.argmax(h,axis=1) #每行的最大值的索引 array([9, 9, 9, 9, 9, 9])
判断两个array是否相等
>>> x array([1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> y = np.ones((1,9)) >>> y array([[ 1., 1., 1., 1., 1., 1., 1., 1., 1.]]) >>> x==y #判断对应位置的元素是否相等 array([[ True, False, False, False, False, False, False, False, False]], dtype=bool) >>> np.mean(x==y) #对x==y的结果取均值 0.1111111111111111
去掉某些行/列
>>> h array([[ 0, 0, 0, 0, 0, 0, 6, 7, 8, 9], [ 0, 0, 0, 0, 0, 0, 16, 17, 18, 19], [ 0, 0, 0, 0, 0, 0, 26, 27, 28, 29], [ 0, 0, 0, 0, 0, 0, 36, 37, 38, 39], [ 0, 0, 0, 0, 0, 0, 46, 47, 48, 49], [ 0, 0, 0, 0, 0, 0, 56, 57, 58, 59]]) >>> w=h[:-1,:] #去掉最后一行 >>> w array([[ 0, 0, 0, 0, 0, 0, 6, 7, 8, 9], [ 0, 0, 0, 0, 0, 0, 16, 17, 18, 19], [ 0, 0, 0, 0, 0, 0, 26, 27, 28, 29], [ 0, 0, 0, 0, 0, 0, 36, 37, 38, 39], [ 0, 0, 0, 0, 0, 0, 46, 47, 48, 49]]) >>> w = h[:-2,:] #去掉最后两行 >>> w array([[ 0, 0, 0, 0, 0, 0, 6, 7, 8, 9], [ 0, 0, 0, 0, 0, 0, 16, 17, 18, 19], [ 0, 0, 0, 0, 0, 0, 26, 27, 28, 29], [ 0, 0, 0, 0, 0, 0, 36, 37, 38, 39]]) >>> w = h[:,:-4] #去掉最后4列 >>> w array([[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]) >>> w = h[:,:4] #得到前四列 >>> w array([[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]])