正文
numpy 笔记
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
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.])