1 矩阵、数组、列表
#from numpy import * import numpy as np
矩阵创建
>>> A = np.array([1,2,3]) array([1, 2, 3]) >>> A = np.mat(A) matrix([[1, 2, 3]]) >>> np.shape(A) (1, 3) >>> B = np.matrix([1,2,3]) >>> np.shape(b) (1, 3) # 基本属性 >>>A = np.array([[2],[1]]) >>>A.ndim #维度 dimension = 2 >>>m,n = A.shape #m=2, n=1 >>>number = A.size #元素总数 = 2 >>>A.dtype #元素类型 dtype('int64') >>>A.itemsize #字节大小 = 8 >>>A.reshape(1,2) #重构 >>>np.resize(A, (1,2)) #重构
常用数组,快速创建
>>>np.zeros((3,3)) #零矩阵,参数是一个tuple类型(3,3) >>>np.ones((2,4)) #1矩阵,默认浮点型,可以使用dtype=int >>>np.random.rand(2,2) #随机阵 >>>np.random.randint(10,size=(3,3)) #0-10之间的随机整数矩阵 >>>np.random.randint(2,8,size=(2,5)) #2-8之间的随机整数矩阵 >>>np.eye(2,2,dtype=int) #单位阵, n=行,M=列,k=对角索引 >>>np.diag([1,2,3]) #对角阵 >>>np.identity(5) #单位阵 >>>np.linspace(10,20, 5, endpoint = False) #等差数列 array([10., 12., 14., 16., 18.]) >>>np.logspace(1, 4, num=10, base=2) #等比数列 array([2., 4., 8., 16.]) >>>np.empty(A.shape) >>>np.empty([3,2], dtype = int) #空数组 array([[ 0, 1072168960], [ 0, 1072168960], [ 0, 0]])
数组操作
>>>A = np.arange(12, dtype = np.int8).reshape(3,4) array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], dtype=int8) >>>B = np.array([np.nan, 1, 2, np.nan, 3, 4, 5]) array([nan, 1., 2., nan, 3., 4., 5.]) # 索引 >>>A[[0,2],[3,1]] #array([3, 9]) >>>np.arange(10)[2:7:2] #array([2, 4, 6]) >>>A[A>5] #array([ 6, 7, 8, 9, 10, 11], dtype=int8) >>>B[~np.isnan(B)] #判断缺失,缺失也可用None表示,np.iscomplex() 判断复数 array([1., 2., 3., 4., 5.]) # 展开 >>>A.flatten() #展开,返回副本 array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], dtype=int8) >>>A.ravel() #展开,按需返回副本 array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], dtype=int8) # 广播 / 压缩 # 不同维度数据运算时,维度自动扩充,并按该维度第一个元素带入运算 >>>x = np.array([[1], [2], [3]]) >>>y = np.array([4, 5, 6]) >>>[u + v for (u,v) in np.broadcast(x,y)] [5, 6, 7, 6, 7, 8, 7, 8, 9] >>>x+y array([[5, 6, 7], [6, 7, 8], [7, 8, 9]]) >>>np.squeeze(x) #删除一维 >>>np.broadcast_to(y, (3,1)) #广播为指定格式 >>>np.expand_dims(y, axis=0) #插入维度 # 迭代 # order:'C' — 按行,'F' — 按列,'A' — 原顺序,'k' — 元素在内存中的出现顺序 >>>a = np.arange(12).reshape(3,4) >>>for i in a: print(i, end=' ') [0 1 2 3] [4 5 6 7] [ 8 9 10 11] >>>for i in np.nditer(a, order='C'): print(i, end=' ') #多维迭代器,深度迭代 , 不指定时a.T与a迭代序列一致 0 1 2 3 4 5 6 7 8 9 10 11 # 广播迭代 >>>a = np.arange(0,60,5).reshape(3,4) >>>b = np.array([1, 2, 3, 4], dtype = int) >>>for x,y in np.nditer([a,b]): print("%d:%d" % (x,y), end=' ') 0:1 5:2 10:3 15:4 20:1 25:2 30:3 35:4 40:1 45:2 50:3 55:4 # 克隆 >>>b = a; c=a.copy() #,order = 'C'|‘F’ >>>id(b) == id(a); id(c) == id(a) #True, False
矩阵运算
>>>A = np.array([[1,2],[3,4]]) >>>B = np.array([[11,12],[13,14]]) >>>A*B #点积 array([[11, 24], [39, 56]]) >>>A*2 #点积 >>>np.multiply(A, B) #点积,对应元素相乘,同A*B >>>np.vdot(A, B) #点积和,对应相乘相加 = 130 >>>np.mat(A)*np.mat(B) #矩阵乘法 matrix([[37, 40], [85, 92]]) >>>np.matmul(A, B) #同np.mat(A)*np.mat(B), 维度不同时,广播 >>>np.dot(A, B) #同np.mat(A)*np.mat(B) >>>A.dot(B) #同np.mat(A)*np.mat(B) >>>np.inner(A, B) #内积, 最后一维 array([[35, 41], [81, 95]]) >>>A = mat(eye(2,2)*0.5) >>>A.I #逆矩阵 >>>A.T #转置 >>>np.square(A) #平方 >>>np.sqrt(A) #开方 # 线性代数 >>>np.linalg.det(a) #行列式 >>>np.linalg.solve(b, [0,2]) #线性方程组求解 >>>np.linalg.inv(x) #逆矩阵
矩阵切片、分割、合并
>>>A = np.mat(np.random.randint(2,8,size=(3,4))) #2-8之间的随机整数矩阵 matrix([[5, 4, 6, 3], [7, 3, 4, 2] [0, 5, 3, 1]]) >>>A[1:,1:] #切片 matrix([[3, 4, 2] [5, 3, 1]]) >>>A=mat(np.ones((2,2))) matrix([[ 1., 1.], [ 1., 1.]]) >>>B=np.mat(np.eye(2)) matrix([[ 1., 0.], [ 0., 1.]]) # 分割 >>>a = np.arange(9) >>>np.split(a, 3) #等分 [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])] >>>np.split(a, [4,7]) #指定位置分割 [array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])] >>>a = np.arange(16).reshape(4,4) >>>np.hsplit(a, 2) >>>np.vsplit(a, 2) # 拼接 >>>np.concatenate((a,b)) #默认axis=0 纵向拼接 >>>np.concatenate((a,b), axis=1) #横向拼接 >>>np.stack((a,b),0) #纵向拼接 >>>np.stack((a,b),1) #横向拼接 >>>np.vstack((A, B)) #按列合并 matrix([[ 1., 1.], [ 1., 1.], [ 1., 0.], [ 0., 1.]]) >>>np.hstack((A, B)) #按行合并 matrix([[ 1., 1., 1., 0.], [ 1., 1., 0., 1.]]) # 追加 >>>a = np.array([[1,2,3],[4,5,6]]) >>>np.append(a, [7,8,9]) #转为一维数组 array([1, 2, 3, 4, 5, 6, 7, 8, 9]) >>>np.append(a, [[7,8,9]], axis=0) #纵向拼接 array([[1,2,3], [4,5,6], [7,8,9]) >>>np.append(a, [[0,0,0],[7,8,9]], axis=1) #横向拼接 array([[1, 2, 3, 0, 0, 0], [4, 5, 6, 7, 8, 9]]) # 插入 >>>np.insert(a,2,[11,12,13]) #序列对应位置插入 array([ 1, 2, 11, 12, 13, 3, 4, 5, 6]) >>>np.insert(a,1,[11],axis = 0) #纵向插入,广播 array([[ 1, 2, 3], [11, 11, 11], [ 4, 5, 6]]) >>>np.insert(a,1,11,axis = 1) #横向插入,广播 array([[ 1, 11, 2, 3], [ 4, 11, 5, 6]]) # 删除 >>>np.delete(a, 5) >>>np.delete(a, 1, axis=0) >>>np.delete(a, 1, axis=1) >>>np.delete(a, np.s_[::2]) # 去重 >>>np.unique(a) array([1, 2, 3, 4, 5, 6]) >>>np.unique(a, return_index = True) #返回索引 (array([1, 2, 3, 4, 5, 6]), array([0, 1, 2, 3, 4, 5], dtype=int64)) >>>np.unique(a,return_inverse = True) #返回下标 >>>np.unique(a,return_counts = True) #返回重复数
矩阵、数组、列表间类型转换
>>>A = [[1,2],[3,2],[5,2]] #列表 [[1, 2], [3, 2], [5, 2]] >>>B = np.array(A) #列表 -> 数组 >>>B = np.asarray(A) #列表 -> 数组 array([[1, 2], [3, 2], [5, 2]]) >>>C = np.mat(A) #列表 -> 矩阵 matrix([[1, 2], [3, 2], [5, 2]]) >>>np.array(C) #矩阵 -> 数组 array([[1, 2], [3, 2], [5, 2]]) >>>C.getA() #矩阵 -> 数组 array([[1,2] [3,2] [5,2]]) >>>C.tolist() #矩阵 -> 列表 [[1, 2], [3, 2], [5, 2]] >>>B.tolist() #数组 -> 列表 [[1, 2], [3, 2], [5, 2]] # 注意: 一维矩阵与一维数组转列表结果不一致 >>>A = np.array([1,2,3]) array([1, 2, 3]) >>>B = np.mat([1,2,3]) matrix([[1, 2, 3]]) >>>C = A.tolist() #数组 -> 列表 [1, 2, 3] >>>D = B.tolist() #矩阵 -> 列表 [[1, 2, 3]] >>> (C==D) False >>> (C is D[0]) #矩阵表示成了二维形式 True
2 字符串操作
>>>np.char.add(['hello', 'hi'],['abc', 'xyz']) #类似R的paste0 array(['helloabc'], dtype='<U8') >>>np.char.multiply('Hello',3) #类似R的rep array('HelloHelloHello', dtype='<U15') # 格式 >>>np.char.center('hello', 20, fillchar = '*') array('*******hello********', dtype='<U20') >>>np.char.capitalize('hello world') array('Hello world', dtype='<U11') >>>np.char.title('hello how are you?') array('Hello How Are You?', dtype='<U18') >>>np.char.lower(['HELLO','WORLD']) array(['hello', 'world'], dtype='<U5') >>>np.char.upper(['hello','world']) array(['HELLO', 'WORLD'], dtype='<U5') # 拆分 >>>np.char.split ('YiibaiPoint,Hyderabad,Telangana', sep = ',') array(list(['YiibaiPoint', 'Hyderabad', 'Telangana']), dtype=object) >>>np.char.splitlines('hello\rhow are you?') array(list(['hello', 'how are you?']), dtype=object) # 压缩 >>>np.char.strip(['arora','admin','java'],'a') array(['ror', 'dmin', 'jav'], dtype='<U5') >>>np.char.join([':','-'],['dmy','ymd']) array(['d:m:y', 'y-m-d'], dtype='<U5') # 替换 >>>np.char.replace ('He is a good boy', 'is', 'was') array('He was a good boy', dtype='<U17') # 编码、解码 >>>np.char.encode('hello', 'cp500') array(b'\x88\x85\x93\x93\x96', dtype='|S5') >>>np.char.decode(b'\x88\x85\x93\x93\x96','cp500') array('hello', dtype='<U5')
3 数学运算
>>>a = np.array([0,30,45,60,90]) >>>b = np.sin(a * np.pi/180) >>>np.degrees(b) # 四舍五入 >>>np.around(a, decimals = -1) >>>np.floor(a) >>>np.ceil(a) # 数组加减乘除 >>>np.add(a,b) >>>np.subtract(a,b) >>>np.multiply(a,b) >>>np.divide(a,b) # 其他操作 >>>np.reciprocal(a) # 倒数 >>>np.power(a,b) # a数组为底,b为幂 >>>np.mod(a,b) # 数组a/b余数 >>>np.remainder(a,b) # 余数 # 复数操作 >>>np.real(a) >>>np.imag(a) >>>np.conj(a) # 共轭复数 >>>np.angle(a, deg = True) # 统计操作 >>>np.min(a, 0) #列最小值 >>>np.max(a, 1) #行最大值 >>>np.amin(a, 0) #数组纵向最小,但参数表示全局 >>>np.amax(a, 1) #数组横向最大 >>>np.mean(a, axis = 0) #均值 >>>np.sum(a, axis=0) #列和 >>>np.average([1,2,3,4], weights=[4,3,2,1], returned=True) #加权均值,返回权值和? >>>np.std([1,2,3,4]) #标准差 >>>np.var([1,2,3,4]) #方差 >>>std = sqrt(mean((x - x.mean())**2)) >>>np.ptp(a, axis = 0) # 极差 >>>np.percentile(a,50, axis = 1) # 分位数 >>>np.median(a, axis = 0) # 中位数 # 排序、排序索引 # kind = quicksort(默认), mergesort, heapsort >>>a = np.array([[3,7],[9,1]]) >>>np.sort(a) # 按行 >>>np.sort(a, axis=0) # 按列 >>>a = np.array([3, 1, 2]) >>>np.argsort(a) # 按行排序索引 array([1, 2, 0], dtype=int64) >>>a[np.argsort(a)] >>>argmin(a, axis=0) # 列最小值行索引 >>>argmax(a, axis=1) >>>dt = np.dtype([('name', 'S10'),('age', int)]) >>>a = np.array([("raju",21),("anil",25),("ravi",17),("amar",27)], dtype = dt) >>>np.sort(a, order = 'name') # 按name array([(b'amar', 27), (b'anil', 25), (b'raju', 21), (b'ravi', 17)], dtype=[('name', 'S10'), ('age', '<i4')]) >>>key = ('b','c','d','a') >>>s = ('raju','anil','ravi','amar') >>>np.lexsort((s,key)) array([3, 0, 1, 2], dtype=int64) >>>np.nonzero(a) #非零元素索引 >>>np.where(x > 3) #满足指定条件的元素位置索引 >>>x = np.arange(9.).reshape(3, 3) >>>condition = np.mod(x,2)==0 >>>np.extract(condition, x) #满足条件的元素,条件为逻辑值 array([0., 2., 4., 6., 8.])