python的numpy总结(转)

转:https://blog.csdn.net/danieljianfeng/article/details/46894185

ones函数

>>> import numpy as np
>>> a=np.ones(3);a
array([ 1.,  1.,  1.])
>>> b=np.ones((3,2));b
array([[ 1.,  1.],
       [ 1.,  1.],
       [ 1.,  1.]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

zeros函数

>>> c=np.zeros(3)
>>> c
array([ 0.,  0.,  0.])
>>> d=np.zeros((2,3));d      
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]]) 
#d=np.zeros(2,3)会报错,d=np.zeros(3,dtype=int)来改变默认的数据类型
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

eye&identity函数

>>> e=np.eye(3);e
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])
>>> e=np.eye(3,2);e
array([[ 1.,  0.],
       [ 0.,  1.],
       [ 0.,  0.]])
>>> e=np.eye(3,1);e
array([[ 1.],
       [ 0.],
       [ 0.]])
>>> e=np.eye(3,3);e
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])
>>> e=np.eye(3,3,1);e
array([[ 0.,  1.,  0.],
       [ 0.,  0.,  1.],
       [ 0.,  0.,  0.]])
e=np.eye(3,3,2);e
array([[ 0.,  0.,  1.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])
>>> e=np.eye(3,3,3);e
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])
>>> e=np.eye(3,3,4);e
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])
>>> p=np.identity(4);p
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.]])
>>> p=np.identity(4,3);p  #会报错
>>> p=np.identity((4,3));p  #会报错
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

empty函数

>>> a=np.empty(3);a
array([  1.60091154e-163,   1.12069303e-258,   3.23790862e-318])
>>> a=np.empty((3,3));a
array([[  1.57741456e-284,   1.57680914e-284,   1.56735002e-163],
       [  1.56205068e-163,   1.62511438e-163,   1.21880041e+171],
       [  1.57757869e-052,   7.34292780e+223,   4.71235856e+257]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

ones_like,zeros_like,empty_like函数

>>> a=np.array([[[1,2],[1,2]],[[1,2],[1,2]],[[1,2],[1,2]]])
>>> a.shape
(3, 2, 2)
>>> b=np.ones_like(a)
>>> b
array([[[1, 1],
        [1, 1]],

       [[1, 1],
        [1, 1]],

       [[1, 1],
        [1, 1]]])
>>> b=np.zeros_like(a);b
array([[[0, 0],
        [0, 0]],

       [[0, 0],
        [0, 0]],

       [[0, 0],
        [0, 0]]])
>>> a=np.array([[[1,2],[1,2]],[[1,2],[1,2]],[[1,2],[1,2]]])
>>> b=np.empty_like(a);b
array([[[39125057, 40012256],
        [81313824, 81313856]],

       [[       0,        0],
        [       0,        0]],

       [[       0,        0],
        [       0,        0]]])
#注意,shape和dtype均复制
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

关于astype转换数据类型

>>> b=np.array([[[1,2],[1,2]],[[1,2],[1,2]],[[1,2],[1,2]]])
>>> b.dtype
dtype('int32')
>>> c=b.astype(float)    #also c=b.astype(np.float64)
>>> c.dtype
dtype('float64')
#float转int会将小数部分去掉
>>> a=np.array([1.7,-2.9])
>>> b=a.astype(int)
>>> b
array([ 1, -2])
#如果字符串组表示的全部是数字,astype可以将其转为数值形式
>>> a=np.array(['23','0.32','-0.9'])
>>> a.dtype
dtype('S4')
>>> a=np.array(['23','0.32','-0.9'],dtype=np.string_)
>>> a.dtype
dtype('S4')
>>> c=a.astype(float);c
array([ 23.  ,   0.32,  -0.9 ])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

Ndarray切片视图而非副本特性

>>> a=np.arange(10)
>>> b=a[5:8];b  #仅仅是取了一个a数组的视图,b相当于a的一个子集
array([5, 6, 7])
>>> b[1]=1234;a
array([   0,    1,    2,    3,    4,    5, 1234,    7,    8,    9])
>>> b[2]=77;a
array([   0,    1,    2,    3,    4,    5, 1234,   77,    8,    9])
>>> b[0]=90;a
array([   0,    1,    2,    3,    4,   90, 1234,   77,    8,    9])
>>> b[:]=64;a
array([ 0,  1,  2,  3,  4, 64, 64, 64,  8,  9])
>>> b
array([64, 64, 64])
>>> b=90  #注意使b中三个元素均变为90的操作是b[:]=90,而不是b=90
>>> b
90
>>> a
array([ 0,  1,  2,  3,  4, 64, 64, 64,  8,  9])
#可以用a.copy()函数避免这个问题,新建一个副本
>>> a=np.arange(10)
>>> b=a[5:8].copy()
>>> b
array([5, 6, 7])
>>> b[:]=64;a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b
array([64, 64, 64])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

花式索引与切片表达上的一个区分

>>> a=np.arange(1,13,1).reshape((2,2,3))
>>> a
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])
>>> a[1][0]
array([7, 8, 9])
>>> a[1,0]    #切片
array([7, 8, 9])
#a[1][0]与a[1,0]效果相同
>>> a[[1,0]]    #花式索引
array([[[ 7,  8,  9],
        [10, 11, 12]],

       [[ 1,  2,  3],
        [ 4,  5,  6]]])
>>> a[[1,0,1]]   #花式索引
array([[[ 7,  8,  9],
        [10, 11, 12]],

       [[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

关于:的使用

>>> a=np.arange(24).reshape(6,2,2)
>>> a
array([[[ 0,  1],
        [ 2,  3]],

       [[ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11]],

       [[12, 13],
        [14, 15]],

       [[16, 17],
        [18, 19]],

       [[20, 21],
        [22, 23]]])
>>> a[[0,2,4,3,5,1]]  #对列进行花式索引
array([[[ 0,  1],
        [ 2,  3]],

       [[ 8,  9],
        [10, 11]],

       [[16, 17],
        [18, 19]],

       [[12, 13],
        [14, 15]],

       [[20, 21],
        [22, 23]],

       [[ 4,  5],
        [ 6,  7]]])
>>> a[:,[1,0]]      #对行进行花式索引
array([[[ 2,  3],
        [ 0,  1]],

       [[ 6,  7],
        [ 4,  5]],

       [[10, 11],
        [ 8,  9]],

       [[14, 15],
        [12, 13]],

       [[18, 19],
        [16, 17]],

       [[22, 23],
        [20, 21]]])
>>> a[:,1]    #选取第二行
array([[ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15],
       [18, 19],
       [22, 23]])
>>> a[1]    #选取第二列
array([[4, 5],
       [6, 7]])
>>> a[:,1][1]  #选取第二行后再选第二列
array([6, 7])
>>> a[:,1][:,1]
array([ 3,  7, 11, 15, 19, 23])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

花式索引补充(花式索引是将数据复制到新数组中)

>>> import numpy as np
>>> a=np.arange(32).reshape((8,4))
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23],
       [24, 25, 26, 27],
       [28, 29, 30, 31]])
>>> a[[4,3,0,6]]
array([[16, 17, 18, 19],
       [12, 13, 14, 15],
       [ 0,  1,  2,  3],
       [24, 25, 26, 27]])
>>> a[[-2]]
array([[24, 25, 26, 27]])
>>> a[[-3,-5,-7]]   #注意排序中2和-2的差别,2代表第三,-2代表倒数第二
array([[20, 21, 22, 23],
       [12, 13, 14, 15],
       [ 4,  5,  6,  7]])
>>> a[[2,1,6,3],[0,2,3,1]]  #取第三列的第一个排在第一位……
array([ 8,  6, 27, 13])
>>> a[[2,1,6,3]][:,[0,3,1,2]]  #先取a[[2,1,6,3]],再对其进行列(行)排列
array([[ 8, 11,  9, 10],
       [ 4,  7,  5,  6],
       [24, 27, 25, 26],
       [12, 15, 13, 14]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

Transpose&swapaxes(数组轴对换)

>>> import numpy as np
>>> a=np.arange(16).reshape((2,2,4))
>>> a
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])
>>> a.transpose()
array([[[ 0,  8],
        [ 4, 12]],

       [[ 1,  9],
        [ 5, 13]],

       [[ 2, 10],
        [ 6, 14]],

       [[ 3, 11],
        [ 7, 15]]])
>>> a.transpose((1,0,2))  #怎么来的并没有搞清楚
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])
>>> a.swapaxes(1,2)  #怎么来的并没有搞清楚
array([[[ 0,  4],
        [ 1,  5],
        [ 2,  6],
        [ 3,  7]],

       [[ 8, 12],
        [ 9, 13],
        [10, 14],
        [11, 15]]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

元素级数组元素

一元ufunc
函数 说明
abs、fabs 计算绝对值,fabs不能用于复数
aqrt 平方根
zebra stripes are neat
square 平方
exp 计算e^x
log、log10、log2、log1p ln、底数10、底数2、log(x+1)
sign 1(正数),0(0)、-1(负数)
ceil 大于等于该值的最大整数
floor 小于等于该值的最大整数
rint 四舍五入,但是dtype保留不变
modf 小数部分和整数部分分开
isnan “哪些值不是一个数字”的布尔型数组
isfinite、isinf “哪些值是无穷”布尔型
cos、cosh、sin、sinh、tan、tanh 三角
arcos、arcosh、arsin、arsinh、artan、artanh 反三角
logical_not 相当于:-a
二元ufunc
函数 说明
add np.add(x,y)
subtract
multiply
divide、floor_divide 除法、丢弃余数
power np.power(a,b) 计算a^b
maximum、fmax  
minmun、fmin  
mod 余数
copysign 第二组元素中的符号复制给第一组元素
greater、greater_equal、less、less_equal、equal、not_equal >、>=、<、<=、==、!= 返回布尔型数组
logical_and、logical_or、logical_xor 逻辑运算

在一组值(网格型)上计算函数sqrt(x^2+y^2 )

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> a=np.arange(-5,5,0.01)
>>> xs,ys=np.meshgrid(a,a)  #np.meshgrid函数接受两个一位数组,并产生一个二维矩阵
>>> ys
array([[-5.  , -5.  , -5.  , ..., -5.  , -5.  , -5.  ],
       [-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],
       [-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],
       ..., 
       [ 4.97,  4.97,  4.97, ...,  4.97,  4.97,  4.97],
       [ 4.98,  4.98,  4.98, ...,  4.98,  4.98,  4.98],
       [ 4.99,  4.99,  4.99, ...,  4.99,  4.99,  4.99]])
>>> z=np.sqrt(xs**2+ys**2)
>>> z
array([[ 7.07106781,  7.06400028,  7.05693985, ...,  7.04988652,
         7.05693985,  7.06400028],
       [ 7.06400028,  7.05692568,  7.04985815, ...,  7.04279774,
         7.04985815,  7.05692568],
       [ 7.05693985,  7.04985815,  7.04278354, ...,  7.03571603,
         7.04278354,  7.04985815],
       ..., 
       [ 7.04988652,  7.04279774,  7.03571603, ...,  7.0286414 ,
         7.03571603,  7.04279774],
       [ 7.05693985,  7.04985815,  7.04278354, ...,  7.03571603,
         7.04278354,  7.04985815],
       [ 7.06400028,  7.05692568,  7.04985815, ...,  7.04279774,
         7.04985815,  7.05692568]])
>>> plt.imshow(z,cmap=plt.cm.gray);plt.colorbar();plt.title("Image plot of $\sqrt{x^2+y^2}$ for a grid of values")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

结果 :imshow将z(二维数组)显示为灰度图,plt.colorbar绘制了右侧颜色栏 
这里写图片描述

将条件逻辑表述为数组运算

numpy.where是三元表达式 x if condition else y的矢量化版本,举例进行比较

>>> import numpy as np
>>> x=np.array([1.1,1.2,1.3,1.4,1.5])
>>> y=np.array([2.1,2.2,2.3,2.4,2.5])
>>> q=np.array([True,False,True,True,False])
>>> result=[(x if c else y)  #if有两个问题1、计算速度慢2、无法用于多维数组
...          for x,y,c in zip(x,y,q)]  
>>> result
[1.1000000000000001, 2.2000000000000002, 1.3, 1.3999999999999999, 2.5]
>>> result=np.where(q,x,y);result
array([ 1.1,  2.2,  1.3,  1.4,  2.5])
#在数据工作中,where通常根据一个数组产生一个新数组
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这里写图片描述

any,all函数

>>> import numpy as np
>>> b=np.array([False,False,True,False])
>>> b.any()
True
>>> b.all()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

any用于测试数组中是否存在一个或多个True,all检测数组中是否都是True 
非布尔型数组中也可以用,非0元素都是True

求5%分位数

>>> a=np.random.randn(1000)
>>> a.sort()  #这一步执行后数组a中的元素以及排好序了,不能写成b=a.sort(),这里b是空值
>>> a[int(0.05*len(a))]  
-1.6949758821658074
  • 1
  • 2
  • 3
  • 4
  • 5

数组集合运算

>>> a=np.array([1,1,2,9,3,5])
>>> np.unique(a)   #a.unique()是错误表达方式  计算唯一元素,并且返回有序结果
array([1, 2, 3, 5, 9])
>>> set(a)    #变成集合形式 并且返回有序结果
set([1, 2, 3, 5, 9])
>>> sorted(set(a))  #纯Python代码
[1, 2, 3, 5, 9]
>>> a=np.array([6,0,0,3,2,5,6])
>>> b=np.array([2,3,6])
>>> np.in1d(a,b)   #a是否包含于b
array([ True, False, False,  True,  True, False,  True], dtype=bool)
>>> np.intersect1d(a,b)   #交集,并返回有序结果
array([2, 3, 6])
>>> np.union1d(a,b)   #并集,并返回有序结果
array([0, 2, 3, 5, 6])
>>> np.setdiff1d(a,b)   #集合的差
array([0, 5])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

数据存储读取

我的文件储存目录: 
C:\Users\Administrator\Documents

>>> import numpy as np
>>> a=np.arange(24).reshape((2,2,6))
>>> a
array([[[ 0,  1,  2,  3,  4,  5],
        [ 6,  7,  8,  9, 10, 11]],

       [[12, 13, 14, 15, 16, 17],
        [18, 19, 20, 21, 22, 23]]])
>>> np.save('AABBCC',a)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这里写图片描述

>>> import numpy as np
>>> np.load('AABBCC.npy')
array([[[ 0,  1,  2,  3,  4,  5],
        [ 6,  7,  8,  9, 10, 11]],

       [[12, 13, 14, 15, 16, 17],
        [18, 19, 20, 21, 22, 23]]])
>>> a=array([[[ 0,  1,  2,  3,  4,  5],
        [ 6,  7,  8,  9, 10, 11]],

       [[12, 13, 14, 15, 16, 17],
        [18, 19, 20, 21, 22, 23]]])
>>> b=np.arange(9)
>>> c=np.array(['b','a'])
>>> np.savez('abc.npz',q=a,w=b,e=c)
>>> p=np.load('abc.npz')
>>> p
<numpy.lib.npyio.NpzFile object at 0x06063830>
>>> p['e']
array(['b', 'a'], 
      dtype='|S1')
>>> p['q']
array([[[ 0,  1,  2,  3,  4,  5],
        [ 6,  7,  8,  9, 10, 11]],

       [[12, 13, 14, 15, 16, 17],
        [18, 19, 20, 21, 22, 23]]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

‘BBAACC.txt’文件如图,将它放在默认路径中 
这里写图片描述

>>> import numpy as np
>>> a=np.loadtxt('BBAACC.txt',delimiter=',')
>>> a
array([[ 866052.,  300238.],
       [ 866052.,  304753.],
       [ 866052.,  300322.],
       [ 866052.,  300539.],
       [ 866052.,  305271.],
       [ 866052.,  306853.],
       [ 866052.,  307567.],
       [ 866052.,  301155.],
       [ 866052.,  300420.],
       [ 866052.,  302583.],
       [ 866052.,  300791.],
       [ 866052.,  300448.],
       [ 866052.,  300014.],
       [ 866052.,  309366.],
       [ 866052.,  323919.],
       [ 866052.,  300126.],
       [ 866052.,  308855.],
       [ 866052.,  303444.]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

numpy.linalg模块

numpy.linalg中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西,与MATLAB和R所使用的是相同的行业标准库。

函数 说明
diag  
dot 逆阵乘法
trace 计算对角线元素和
det 计算矩阵行列式
eig 本征值和本征向量
inv
pinv  
qr QR分解
svd 奇异值分解
solve Ax=b
lstsq Ax=b最小二乘解

猜你喜欢

转载自blog.csdn.net/qq_38788128/article/details/80812459