python中numpy的矩阵、多维数组的用法
|
1. 引言 最近在将一个算法由matlab转成python,初学python,很多地方还不熟悉,总体感觉就是上手容易,实际上很优雅地用python还是蛮难的。目前为止,觉得就算法仿真研究而言,还是matlab用得特别舒服,可能是比较熟悉的缘故吧。matlab直接集成了很多算法工具箱,函数查询、调用、变量查询等非常方便,或许以后用久了python也会感觉很好用。与python相比,最喜欢的莫过于可以直接选中某段代码执行了,操作方便,python也可以实现,就是感觉不是很方便。 言归正传,做算法要用到很多的向量和矩阵运算操作,这些嘛在matlab里面已经很熟悉了,但用python的时候需要用一个查一个,挺烦的,所以在此稍作总结,后续使用过程中会根据使用体验更新。 python的矩阵运算主要依赖numpy包,scipy包以numpy为基础,大大扩展了后者的运算能力。 2. 创建一般的多维数组 import numpy as np a = np.array([1,2,3],dtype=int) # 创建1*3维数组 array([1,3]) type(a) # numpy.ndarray类型 a.shape # 维数信息(3L,) a.dtype.name # 'int32' a.size # 元素个数:3 a.itemsize #每个元素所占用的字节数目:4 b=np.array([[1,[4,5,6]],dtype=int) # 创建2*3维数组 array([[1,6]]) b.shape # 维数信息(2L,3L) b.size # 元素个数:6 b.itemsize # 每个元素所占用的字节数目:4 c=np.array([[1,dtype='int16') # 创建2*3维数组 array([[1,dtype=int16) c.shape # 维数信息(2L,3L) c.size # 元素个数:6 c.itemsize # 每个元素所占用的字节数目:2 c.ndim # 维数 d=np.array([[1,dtype=complex) # 复数二维数组 d.itemsize # 每个元素所占用的字节数目:16 d.dtype.name # 元素类型:'complex128' 3. 创建特殊类型的多维数组 a1 = np.zeros((3,4)) # 创建3*4全零二维数组 输出: array([[ 0.,0.,0.],[ 0.,0.]]) a1.dtype.name # 元素类型:'float64' a1.size # 元素个数:12 a1.itemsize # 每个元素所占用的字节个数:8 a2 = np.ones((2,3,4),dtype=np.int16) # 创建2*3*4全1三维数组 a2 = np.ones((2,dtype='int16') # 创建2*3*4全1三维数组 输出: array([[[1,1,1],[1,1]],[[1,1]]],dtype=int16) a3 = np.empty((2,3)) # 创建2*3的未初始化二维数组 输出:(may vary) array([[ 1.,2.,3.],[ 4.,5.,6.]]) a4 = np.arange(10,30,5) # 初始值10,结束值:30(不包含),步长:5 输出:array([10,15,20,25]) a5 = np.arange(0,0.3) # 初始值0,结束值:2(不包含),步长:0.2 输出:array([ 0.,0.3,0.6,0.9,1.2,1.5,1.8]) from numpy import pi np.linspace(0,9) # 初始值0,结束值:2(包含),元素个数:9 输出: array([ 0.,0.25,0.5,0.75,1.,1.25,1.75,2. ]) x = np.linspace(0,2*pi,9) 输出: array([ 0.,0.78539816,1.57079633,2.35619449,3.14159265,3.92699082,4.71238898,5.49778714,6.28318531]) a = np.arange(6) 输出: array([0,4,5]) b = np.arange(12).reshape(4,3) 输出: array([[ 0,2],[ 3,5],[ 6,7,8],[ 9,10,11]]) c = np.arange(24).reshape(2,4) 输出: array([[[ 0,[ 4,6,7],[ 8,9,11]],[[12,13,14,15],[16,17,18,19],[20,21,22,23]]]) 使用numpy.set_printoptions可以设置numpy变量的打印格式 在ipython环境下,使用help(numpy.set_printoptions)查询使用帮助和示例 4. 多维数组的基本操作 加法和减法操作要求操作双方的维数信息一致,均为M*N为数组方可正确执行操作。 a = np.arange(4) 输出: array([0,3]) b = a**2 输出: array([0,9]) c = 10*np.sin(a) 输出: array([ 0.,8.41470985,9.09297427,1.41120008]) n < 35 输出: array([ True,True,True],dtype=bool) A = np.array([[1,[0,1]]) B = np.array([[2,0],[3,4]]) C = A * B # 元素点乘 输出: array([[2,4]]) D = A.dot(B) # 矩阵乘法 输出: array([[5,4],4]]) E = np.dot(A,B) # 矩阵乘法 输出: array([[5,4]]) 多维数组操作过程中的类型转换 When operating with arrays of different types,the type of the resulting array corresponds to the more general or precise one (a behavior known as upcasting) 即操作不同类型的多维数组时,结果自动转换为精度更高类型的数组,即upcasting a = np.ones((2,3),dtype=int) # int32 b = np.random.random((2,3)) # float64 b += a # 正确 a += b # 错误 a = np.ones(3,dtype=np.int32) b = np.linspace(0,pi,3) c = a + b d = np.exp(c*1j) 输出: array([ 0.54030231+0.84147098j,-0.84147098+0.54030231j,-0.54030231-0.84147098j]) d.dtype.name 输出: 'complex128' 多维数组的一元操作,如求和、求最小值、最大值等 a = np.random.random((2,3)) a.sum() a.min() a.max() b = np.arange(12).reshape(3,4) 输出: array([[ 0,11]]) b.sum(axis=0) # 按列求和 输出: array([12,21]) b.sum(axis=1) # 按行求和 输出: array([ 6,38]) b.cumsum(axis=0) # 按列进行元素累加 输出: array([[ 0,8,10],[12,21]]) b.cumsum(axis=1) # 按行进行元素累加 输出: array([[ 0,6],22],27,38]]) universal functions B = np.arange(3) np.exp(B) np.sqrt(B) C = np.array([2.,-1.,4.]) np.add(B,C) 其他的ufunc函数包括: all,any,apply_along_axis,argmax,argmin,argsort,average,bincount,ceil,clip,conj,corrcoef,cov,cross,cumprod,cumsum,diff,dot,floor,inner,lexsort,max,maximum,mean,median,min,minimum,nonzero,outer,prod,re,round,sort,std,sum,trace,transpose,var,vdot,vectorize,where 5. 数组索引、切片和迭代 a = np.arange(10)**3 a[2] a[2:5] a[::-1] # 逆序输出 for i in a: print (i**(1/3.)) def f(x,y): return 10*x+y b = np.fromfunction(f,(5,dtype=int) b[2,3] b[0:5,1] b[:,1] b[1:3,:] b[-1] c = np.array([[[0,[10,11,12]],[[100,101,102],[110,111,112]]]) 输出: array([[[ 0,[ 10,112]]]) c.shape 输出: (2L,2L,3L) c[0,...] c[0,:,:] 输出: array([[ 0,12]]) c[:,2] c[...,2] 输出: array([[ 2,12],[102,112]]) for row in c: print(row) for element in c.flat: print(element) a = np.floor(10*np.random.random((3,4))) 输出: array([[ 3.,9.,8.,4.],[ 2.,4.,6.],6.,2.]]) a.ravel() 输出: array([ 3.,...,2.]) a.reshape(6,2) 输出: array([[ 3.,9.],[ 8.,1.],2.]]) a.T 输出: array([[ 3.,[ 9.,2.]]) a.T.shape 输出: (4L,3L) a.resize((2,6)) 输出: array([[ 3.,2.]]) a.shape 输出: (2L,6L) a.reshape(3,-1) 输出: array([[ 3.,2.]]) 详查以下函数: ndarray.shape,reshape,resize,ravel 6. 组合不同的多维数组 a = np.floor(10*np.random.random((2,2))) 输出: array([[ 5.,2.],[ 6.,2.]]) b = np.floor(10*np.random.random((2,2))) 输出: array([[ 0.,1.]]) np.vstack((a,b)) 输出: array([[ 5.,1.]]) np.hstack((a,1.]]) from numpy import newaxis np.column_stack((a,1.]]) a = np.array([4.,2.]) b = np.array([2.,8.]) a[:,newaxis] 输出: array([[ 4.],[ 2.]]) b[:,newaxis] 输出: array([[ 2.],[ 8.]]) np.column_stack((a[:,newaxis],b[:,newaxis])) 输出: array([[ 4.,8.]]) np.vstack((a[:,newaxis])) 输出: array([[ 4.],[ 2.],[ 8.]]) np.r_[1:4,4] 输出: array([1,4]) np.c_[np.array([[1,3]]),np.array([[4,6]])] 输出: array([[1,6]]) 详细使用请查询以下函数: hstack,vstack,column_stack,concatenate,c_,r_ 7. 将较大的多维数组分割成较小的多维数组 a = np.floor(10*np.random.random((2,12))) 输出: array([[ 9.,7.,3.,[ 5.,7.]]) np.hsplit(a,3) 输出: [array([[ 9.,1.]]),array([[ 7.,[ 7.,2.]]),array([[ 9.,[ 3.,7.]])] np.hsplit(a,(3,4)) 输出: [array([[ 9.,3.]]),array([[ 6.],[ 1.]]),7.]])] 实现类似功能的函数包括: hsplit,vsplit,array_split 8. 多维数组的复制操作 a = np.arange(12) 输出: array([ 0,11]) not copy at all b = a b is a # True b.shape = 3,4 a.shape # (3L,4L) def f(x) # Python passes mutable objects as references,so function calls make no copy. print(id(x)) # id是python对象的唯一标识符 id(a) # 111833936L id(b) # 111833936L f(a) # 111833936L 浅复制 c = a.view() c is a # False c.base is a # True c.flags.owndata # False c.shape = 2,6 a.shape # (3L,4L) c[0,4] = 1234 print(a) 输出: array([[ 0,[1234,11]]) s = a[:,1:3] s[:] = 10 print(a) 输出: array([[ 0,11]]) 深复制 d = a.copy() d is a # False d.base is a # False d[0,0] = 9999 print(a) 输出: array([[ 0,11]]) numpy基本函数和方法一览 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
