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.])

  

  

原文地址:https://www.cnblogs.com/iupoint/p/9635131.html