numpy中的数组类型为ndarry
创建
# -*- coding: utf-8 -*- import numpy as np #用列表或元组创建 a = np.array([[1,2,3],[4,5,6]]) b = np.array([1,2],dtype=complex) #类似内置函数range c = np.arange(24).reshape(2,3,4) #等差,等比数组 d = np.linspace(0,1,10,endpoint=False) print np.logspace(0,4,3,base=2) #创建特殊数组 print np.zeros((2,3)) print np.zeros_like(a) print np.ones((2,3),dtype=np.int16) #全1 print np.empty((2,3)) print np.eye(3) #单位阵 #从字符串,函数,文件等创建 s ='abcdef' print np.fromstring(s,dtype=np.int8) print np.fromfunction(lambda i,j:(i+1)*(j+1), (9,9)) #fromfile从二进制文件中创建,tofile写入文件 #从文件创建 np.savetxt('123.txt',a) #存为文本 e = np.loadtxt('123.txt') #文件操作还有savez,save,load np.save('c.npy', c) #存为二进制,后缀不可变 c = np.load('c.npy') print c np.savez('c.npz', c,d) #存储多个数组 d = np.load('c.npz') print d['arr_0'], d['arr_1'] c.tofile('c.bin') c = np.fromfile('c.bin',dtype=np.int32) #读出来是一维的 print c #创建随机数组 print np.random.random((2,3)) #结构体数组 persontype = np.dtype({'names':['name','age','weight'], 'formats':['S30','i','f']}, align=True) f = np.array([('zhang',32,75.5), ('wang',24,65.2)], dtype=persontype) print f print f['name'] print f[0]['age']
属性
# -*- coding: utf-8 -*- import numpy as np a = np.array([[1,2,3],[4,5,6]]) print a.ndim #维数 print a.shape #(3,2) 每个维数的长度 print a.size #元素个数 print a.dtype #float64,元素类型.所有类型可通过set(np.typeDict.values())查看 print a.itemsize #每个元素的字节数 print a.data #缓冲区地址
使用
# -*- coding: utf-8 -*- import numpy as np a = np.array([[1,2,3],[4,5,6]]) print a[1][2] index = (1,2) print a[index] print a[0:2,1] print a[:,[0,2]] #取第0和2列 print a[1] print a[...,1] for row in a: print row for element in a.flat: print element b = a>4 a[b] = 0 print a
操作
# -*- coding: utf-8 -*- import numpy as np a = np.array([[1,2,3],[4,5,6]]) #改变大小 a.ravel() #展平为1维数组 print a a.shape = (3,2) #元素在内存中的位置并没有改变 print a.reshape(2,-1) #a不动,返回改变形状后的数组,-1对应的维自动计算 a.resize((2,3)) print a #组合 b = np.floor(10*np.random.random((2,3))) print np.vstack((a,b)) print np.hstack((a,b)) #类似还有concatenate, r_, c_ #分割 print np.hsplit(a,3) #复制 c = a #c跟a完全相同 print c is a c = a.view() #c跟a虽是不同数组,但c跟a公用数据. c = a.copy() #深拷贝,c跟a完全不同 print a.repeat(3,axis=0) a = np.array([1,2,3,4,5]) b = np.array([2,4,7]) ax,bx = np.ix_(a,b) print ax.shape print ax*bx #产生能快速广播的数组 x,y = np.ogrid[:1:4j, :1:3j] #和arange类似,三个产生是开始值,结束值,步长,步长为虚数表示长度 print x print y print 2*x + y x,y = np.mgrid[:1:4j, :1:3j] #与ogrid不同的是,它返回的是广播后的数组 print x print y
运算
# -*- coding: utf-8 -*- import numpy as np a = np.array([[4,3],[2,1]]) b = np.array([[1,1],[0,1]]) #逻辑运算 print np.logical_or(a==b, a<b) print np.any(a==b) print np.all(a>b) #对每个元素操作 print a<3 print a**2 print a*b a *= 3 np.add(a,b,a) print a #通用函数 print np.exp(a) print np.sort(a) #对每行排序 ''' 当使用ufunc函数对两个数组进行计算时,ufunc函数会对这两个数组的对应元素进行计算,因此它要求这两个数组的形状相同。如果形状不同,会进行如下的广播(broadcasting)处理: 1. 让所有输入数组都向其中维数最多的数组看齐,shape属性中不足的部分都通过在前面加1补齐。 2. 输出数组的shape属性是输入数组的shape属性的各个轴上的最大值。 3. 如果输入数组的某个轴的长度为1或与输出数组的对应轴的长度相同时,这个数组能够用来计算,否则出错。 4. 当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值。 ''' #将a视为1维数组 print a.max() #a.func()等同于np.func(a) print a.argmin() print a.sum() #以下4个为统计函数 print a.mean() print a.var() print a.std() print np.cov(a) #也可以对指定的维操作,例如 print a.sum(axis=0) print np.add.reduce(a,axis=1) print np.add.accumulate(a,axis=1) #于reduce不同的是它保留中间结果 print np.inner(a,a) #计算两个数组最后1维的内积 print np.multiply.outer([1,2,3,4,5],[2,3,4]) #先使第一个参数的shape变为(5,1),再multiply,再执行squeeze剔除长度为1的轴
线性代数
# -*- coding: utf-8 -*- import numpy as np import numpy.matlib a = np.array([[1.,2.],[3.,4.]]) b = np.array([[1,1],[0,1]]) print a.transpose() print np.trace(a) print a.trace() print np.linalg.det(a) print np.linalg.eig(a) #特征向量和特征值 print np.dot(a,b) #矩阵乘法 #解方程组 y = np.array([[5.],[7,]]) print np.linalg.solve(a,y) #linalg更多函数见http://docs.scipy.org/doc/numpy/reference/routines.linalg.html #矩阵类继承自2维数组 A = np.mat(a) print A.T print A.I X = np.matrix('5 6; 7 8').T print A*X print A[:,1] #跟数组不一样,这里切片的结果还是矩阵 print numpy.matlib.identity(3,dtype=int) #单位阵