首页 > 技术文章 > numpy所有函数使用教程

AFlyingBird 2019-08-27 09:23 原文

2019-08-2610:28:52

numpy中文教程地址:https://yiyibooks.cn/xx/NumPy_v111/user/index.html

1. np.empty(shape,dtype=float,order="C")

函数说明:用来创建一个指定形状和数据类型且未初始化的数组,变量中的元素是随机生成的,实际为空。

实例:

>>> import numpy as np
>>> np.empty([2,3],dtype=float)
array([[0., 0., 0.],
  [0., 0., 0.]])

2.numpy.zeros(shape, dtype = float, order = 'C')

函数说明:用来创建指定大小的元素为0的数组

实例:

>>> np.zeros(shape=(2,3))
array([[0., 0., 0.],
   [0., 0., 0.]])

3.numpy.ones(shape, dtype = None, order = 'C')

函数说明:用来创建指定大小的元素为1的数组

实例:

>>> np.ones(shape=(2,3))
array([[1., 1., 1.],

   [1., 1., 1.]])

4.np.array(object,dtype=None,copy=True,order='K',subok=False,ndmin=0)

函数说明:根据目标元素创建数组,目标元素可以为列表,元素,等。

实例:

>>> np.array([[1,23],[2,3]])
array([[ 1, 23],
   [ 2, 3]])

5.np.full(shape,fill_value,dtype=None,order='C')

函数说明:生成指定shape大小的数组,此数组用指定的值填充。

实例:

>>> np.full((2,3),7)
array([[7, 7, 7],
   [7, 7, 7]])

6.np.ones_like(a,dtype=None,order='K',subok=True,shape=None);np.zeros_like(),np.empty_like()

函数说明:生成与目标数组a相同shape大小的数组。np.zeros_like()和np.empty_like()与np.ones_like()函数类似。

实例:

>>> import numpy as np
>>> a=np.array([[[1,2],[2,3]],[[3,4],[1,2]],[[3,2],[2,1]]])
>>> a
array([[[1, 2],
   [2, 3]],

   [[3, 4],
   [1, 2]],

   [[3, 2],
   [2, 1]]])
>>> 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.shape
(3, 2, 2)

>>> c=np.zeros_like(a)
>>> c
array([[[0, 0],
   [0, 0]],

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

   [[0, 0],
   [0, 0]]])
>>> c.shape
(3, 2, 2)

>>> d=np.empty_like(a)
>>> d
array([[[0, 0],
   [0, 0]],

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

   [[0, 0],
   [0, 0]]])
>>> d.shape
(3, 2, 2)

7.np.reshape(a,newshape,order='C')

函数说明:生成与目标数据a具有相同类型不同shape的数组。新数组与原来数组的元素数量要相同。newshape可以且只能保留一个维度的值为-1,reshape函数可以自动计算。

    个人理解:计算过程为把原来的数组从最高维度(最右侧维度),把所有元素串起来形成一维数据后,按照新的reshape从最高纬度到最低维度依次填充数据。

实例:

>>> import numpy as np
>>> a= np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12],[13, 14, 15, 16]])
>>> a
array([[ 1, 2, 3, 4],
   [ 5, 6, 7, 8],
   [ 9, 10, 11, 12],
   [13, 14, 15, 16]])
>>> a.reshape(-1)
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])
>>> a.reshape(-1,2)
array([[ 1, 2],
   [ 3, 4],
   [ 5, 6],
   [ 7, 8],
   [ 9, 10],
   [11, 12],
   [13, 14],
   [15, 16]])

8.属性获得:np.ndim,np.shape,np.size,np.dtype,np.real,np.imag

函数说明:获得numpy数组的数据属性值(不能加括号),数组的所有数据具有相同的数据类型(float,int等),不过不是,numpy会自动进行转化。

np.ndim为数组的秩,也即轴或者维度的数量,例如一维为1,二维为2,三维空间为3。

np.shape为数据的详细维度,返回的是一个元组,例如一维为(n, ),二维为(m,n),三维为(m,n,k)。

np.size为数组元素的总个数,例如,一维为n,二维为m*n,三维为m*n*k。

np.dtype为数组的元素数据类型,例如int8,int16,int32,int64,uint8,uint16,float16,float32等等。

np.real为元素的实部

np.imag为元素的虚部

 实例:

>>> a=np.array([1,2,3])
>>> b=np.array([[1,2],[3,4],[5,3]])
>>> c=np.array([[[2,3,4],[2,3,1]],[[2,3,1],[5,6,7]]])
>>> a
array([1, 2, 3])
>>> b
array([[1, 2],
   [3, 4],
   [5, 3]])
>>> c
array([[[2, 3, 4],
   [2, 3, 1]],

   [[2, 3, 1],
   [5, 6, 7]]])
>>> a.ndim
1
>>> b.ndim
2
>>> c.ndim
3
>>> a.shape
(3,)
>>> b.shape
(3, 2)
>>> c.shape
(2, 2, 3)
>>> a.size
3
>>> b.size
6
>>> c.size
12
>>> a.dtype
dtype('int64')
>>> b.dtype
dtype('int64')
>>> c.dtype
dtype('int64')

9.np.linspace(start,stop,num=50,endpoint=True,retstep=False,dytpe=None,axis=0)

函数说明:生成从开始到终止指定间隔内均匀间隔的数字序列。

个人理解:当知道间隔内的样本数时采用

实例:

>>> np.linspace(2.0,3.0,num=5)
array([2. , 2.25, 2.5 , 2.75, 3. ])
>>> np.linspace(2.0,3.0,num=5,endpoint=False)
array([2. , 2.2, 2.4, 2.6, 2.8])
>>> np.linspace(2.0,3.0,num=5,retstep=True)
(array([2. , 2.25, 2.5 , 2.75, 3. ]), 0.25)

10.np.logspace(start,stop,num=50,endpoint=True,base=10.0,dtype=None)

函数说明:生成固定间隔内的指定数目的等比数列,默认是意10为底的。

实例:

>>> np.logspace(1.0,2.0,num=10)
array([ 10. , 12.91549665, 16.68100537, 21.5443469 ,27.82559402, 35.93813664, 46.41588834, 59.94842503,77.42636827, 100. ])

11.np.arange(start,stop,step,dtype=None)

函数说明:生成指定间隔内固定间隔的数据。如果不指定step,默认为1;如果不指定start,默认为0。

个人理解:与np.linspace的区别是,当知道间隔内的固定间隔时采用。

实例:

>>> np.arange(4)
array([0, 1, 2, 3])
>>> np.arange(3,7)
array([3, 4, 5, 6])
>>> np.arange(3,10,2)
array([3, 5, 7, 9])

12.数学运算:+,-,*,/,**

函数说明:基本的数学运算,是数组之间对应元素之间的数学运算,特殊的**符号表示次方,例如3**2=27

个人理解:两个数组之间如果shape相同可直接计算,不相同时至少保证其中一个维度相同(此时使用numpy的广播性质进行扩展计算)

实例:

>>> b=np.ones(shape=(2,3))

>>> b
array([[1., 1., 1.],
   [1., 1., 1.]])

>>> k=np.array([[2,3,4],[22,33,12]])

>>> k
array([[ 2, 3, 4],
   [22, 33, 12]])

>>> b+k
array([[ 3., 4., 5.],
   [23., 34., 13.]])
>>> b-k
array([[ -1., -2., -3.],
   [-21., -32., -11.]])
>>> b*k
array([[ 2., 3., 4.],
   [22., 33., 12.]])
>>> b/k
array([[0.5 , 0.33333333, 0.25 ],
   [0.04545455, 0.03030303, 0.08333333]])
>>> b**2
array([[1., 1., 1.],
   [1., 1., 1.]])
>>> k**2
array([[ 4, 9, 16],
   [ 484, 1089, 144]])

>>> a=np.ones(3)

>>> a
array([1., 1., 1.])

>>> c=np.array([1,2,3])
>>> a*c
array([1., 2., 3.])
>>> b*c
array([[1., 2., 3.],
   [1., 2., 3.]])

13.A.dot(B),A.T

函数说明:dot表示矩阵乘法,要求第一元素的列数等于第二个元素的行数,.T表示矩阵的转置。

实例:

>>> import numpy as np
>>> A=np.array([[1,1],[2,3]])
>>> B=np.array([[1,2,3],[1,1,1]])
>>> A
array([[1, 1],
   [2, 3]])
>>> B
array([[1, 2, 3],
   [1, 1, 1]])
>>> A.dot(B)
array([[2, 3, 4],
   [5, 7, 9]])
>>> A.T
array([[1, 2],
   [1, 3]])

14.np.sum(a,axis=None,dtype=None,out=None,keepdim=<no value>,initial=<no value>,where=<no value>)

函数说明:求目标数组a,指定维度的和,如果没有指定为所有维度的元素。

参数说明:a是要进行加法运算的数组元素。axis可取1.None(默认):对所有元素求和,2.整数:对指定维度求和(压缩指定维度),3,整数元组

实例:

>>> A
array([[1, 1],
   [2, 3]])
>>> np.sum(A)
7
>>> np.sum(A,axis=0)
array([3, 4])             #说明:0维度消失,3=1+2,4=1+3
>>> B=np.ones((2,3,4),dtype=int)
>>> B
array([[[1, 1, 1, 1],
   [1, 1, 1, 1],
   [1, 1, 1, 1]],

   [[1, 1, 1, 1],
   [1, 1, 1, 1],
   [1, 1, 1, 1]]])
>>> np.sum(B,axis=(0,1))
array([6, 6, 6, 6])

15. np.min(a,axis=None,dtype=None,out=None,keepdim=<no value>,initial=<no value>,where=<no value>)

函数说明:求目标数组a指定维度的最小值,如果没有指定为所有维度的元素。

参数说明:与np.sum函数相同。

实例:

>>> a=np.arange(8).reshape(2,4)
>>> a
array([[0, 1, 2, 3],
   [4, 5, 6, 7]])
>>> np.min(a)
0
>>> np.min(a,axis=0)
array([0, 1, 2, 3])

16.np.max(a,axis=None,dtype=None,out=None,keepdim=<no value>,initial=<no value>,where=<no value>)

函数说明:求目标数组a指定维度的最大值,如果没有指定为所有维度的元素。

函数说明:与np.sum函数相同。

实例:

>>> a
array([[0, 1, 2, 3],
   [4, 5, 6, 7]])
>>> a.max()
7
>>> a.max(axis=1)
array([3, 7])

17.np.exp(x,/,out=None)

函数说明:对目标数组x的所有元素计算以e为底的指数数值。

实例:

>>> a=np.arange(6)
>>> b=a.reshape(2,3)
>>> a
array([0, 1, 2, 3, 4, 5])
>>> b
array([[0, 1, 2],
   [3, 4, 5]])
>>> np.exp(a)
array([ 1. , 2.71828183, 7.3890561 , 20.08553692, 54.59815003, 148.4131591 ])
>>> np.exp(b)
array([[ 1. , 2.71828183, 7.3890561 ],[ 20.08553692, 54.59815003, 148.4131591 ]])

18.np.sqrt(x,/,out=None)

函数说明:对目标数组x的所有元素求0.5次方(开方)

实例:

>>> a=np.array([0,1,4,9])
>>> b=a.reshape(2,2)
>>> a
array([0, 1, 4, 9])
>>> b
array([[0, 1],
   [4, 9]])
>>> np.sqrt(a)
array([0., 1., 2., 3.])
>>> np.sqrt(b)
array([[0., 1.],
   [2., 3.]])

19.切片与索引

函数说明:对数组可以采用0-n的下标进行索引,可以使用冒号分割符start:stop:step进行分割,可使用...来选择那个维度的元组的长度与数组长度相同

实例:

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

   [[ 6, 7],
   [ 8, 9],
   [10, 11]]])
>>> a[:,1,:]
array([[2, 3],
   [8, 9]])
>>> a[1,1,1]
9
>>> a[...,:,1]
array([[ 1, 3, 5],
   [ 7, 9, 11]])

20.整数数组索引

说明:采用整数数组获取元素,例如[1,2]与[1,2]组合或者四个元素

个人理解:整数数组索引与切片索引是相同的,只不过整数数组的元素较少,可以获得指定行或者列的元素。

实例:

>>> a=np.arange(2,12).reshape(2,5)
>>> a
array([[ 2, 3, 4, 5, 6],
   [ 7, 8, 9, 10, 11]])
>>> a=np.arange(2,14).reshape(3,4)
>>> a
array([[ 2, 3, 4, 5],
   [ 6, 7, 8, 9],
   [10, 11, 12, 13]])
>>> a[[0,1],[0,3]]
array([2, 9])
>>> a[[0,2],[3]]
array([ 5, 13])

21.布尔索引

说明:把整数数组中的数字换为布尔值来选择元素,布尔值为True则选择,布尔值为False则不选择;布尔值一般通过布尔运算(例如,比较运算符)来得到。

实例:

>>> a=np.linspace(1,100,15,dtype=int).reshape(3,5)
>>> a
array([[ 1, 8, 15, 22, 29],
   [ 36, 43, 50, 57, 64],
   [ 71, 78, 85, 92, 100]])
>>> mask=a>50
>>> mask
array([[False, False, False, False, False],
   [False, False, False, True, True],
   [ True, True, True, True, True]])
>>> a[mask]
array([ 57, 64, 71, 78, 85, 92, 100])

22.花式索引

说明:同样是利用整数数组进行索引。

个人理解:花式索引的索引数组维度一般小于被索引数组,这样可以把索引数组的值当做目标数组的某个轴的下标来取值。例如,一维索引数组[1,2],如果目标是一维数组,则得到是第1,和第2个元素,如果目标是二维数组,则得到是0轴的第1和第2行数据。

实例:

>>> a=np.arange(2,100,5).reshape(-1,5)
>>> a
array([[ 2, 7, 12, 17, 22],
   [27, 32, 37, 42, 47],
   [52, 57, 62, 67, 72],
   [77, 82, 87, 92, 97]])
>>> a[[1,2]]
array([[27, 32, 37, 42, 47],
   [52, 57, 62, 67, 72]])
>>> a[[-1,0,2]]
array([[77, 82, 87, 92, 97],
   [ 2, 7, 12, 17, 22],
   [52, 57, 62, 67, 72]])

23.广播机制

说明:numpy最大最明显的有点就是广播机制,去掉了for循环,简单方便快捷。

个人理解:两个数组运算的时候,如果其中一个数组的的某个维度为1,则自动触发广播机制,numpy会在当前维度的所有数据进行重复计算。

>>> a=np.linspace(2,100,12).reshape(3,4)
>>> a
array([[ 2. , 10.90909091, 19.81818182, 28.72727273],
   [ 37.63636364, 46.54545455, 55.45454545, 64.36363636],
   [ 73.27272727, 82.18181818, 91.09090909, 100. ]])
>>> b=np.array([1,2,3])
>>> b
array([1, 2, 3])
>>> a*b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (3,4) (3,)

#注释说明:个人理解b的shape为(1,3),a与b没有保证两者只有一个维度不同。
>>> b=np.array([1,2,3,4])
>>> b
array([1, 2, 3, 4])
>>> a*b
array([[ 2. , 21.81818182, 59.45454545, 114.90909091],
   [ 37.63636364, 93.09090909, 166.36363636, 257.45454545],
   [ 73.27272727, 164.36363636, 273.27272727, 400. ]])
>>> a+b
array([[ 3. , 12.90909091, 22.81818182, 32.72727273],
   [ 38.63636364, 48.54545455, 58.45454545, 68.36363636],
   [ 74.27272727, 84.18181818, 94.09090909, 104. ]])
>>> b=np.array([1,2,3]).reshape(3,1)
>>> b
array([[1],
   [2],
   [3]])
>>> a
array([[ 2. , 10.90909091, 19.81818182, 28.72727273],
   [ 37.63636364, 46.54545455, 55.45454545, 64.36363636],
   [ 73.27272727, 82.18181818, 91.09090909, 100. ]])
>>> a*b
array([[ 2. , 10.90909091, 19.81818182, 28.72727273],
   [ 75.27272727, 93.09090909, 110.90909091, 128.72727273],
   [219.81818182, 246.54545455, 273.27272727, 300. ]])

24.np.cumsum(a,axis=None,dtype=None,out=None)

函数说明:对目标数组在指定轴上进行累加计算。

实例:

>>> a=np.arange(12).reshape(3,4)
>>> a
array([[ 0, 1, 2, 3],
   [ 4, 5, 6, 7],
   [ 8, 9, 10, 11]])
>>> np.cumsum(a)
array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66])
>>> np.cumsum(a,axis=0)
array([[ 0, 1, 2, 3],
   [ 4, 6, 8, 10],
   [12, 15, 18, 21]])

#结果说明:

#array([[ 0=0,         1=1,             2=2,             3=3],
#   [ 4=0+4,      6=1+5,        8=2+6,        10=3+7],
#   [12=0+4+8, 15=1+5+9, 18=2+6+10,  21=3+7+11]])
>>> np.cumsum(a,axis=1)
array([[ 0, 1, 3, 6],
   [ 4, 9, 15, 22],  
   [ 8, 17, 27, 38]])

25.np.eye(N,M=None,k=0,dtype=<class 'float'>,order='C')

函数说明:生成一个指定k对角线为1,其余元素全为0的二维矩阵。

参数说明:N为0维度的长度,M为1维度的长度(若没有赋值默认为N),k为对角线的位置(=0为主对角,>0为右上对角线,<0为左下对角线)

实例说明:

>>> np.eye(3,dtype=int)
array([[1, 0, 0],
   [0, 1, 0],
   [0, 0, 1]])
>>> np.eye(4,k=1)
array([[0., 1., 0., 0.],
   [0., 0., 1., 0.],
   [0., 0., 0., 1.],
   [0., 0., 0., 0.]])
>>> np.eye(4)
array([[1., 0., 0., 0.],
   [0., 1., 0., 0.],
   [0., 0., 1., 0.],
   [0., 0., 0., 1.]])
>>> np.eye(4,dtype=int)
array([[1, 0, 0, 0],
   [0, 1, 0, 0],
   [0, 0, 1, 0],
   [0, 0, 0, 1]])
>>> np.eye(4,k=1,dtype=int)
array([[0, 1, 0, 0],
   [0, 0, 1, 0],
   [0, 0, 0, 1],
   [0, 0, 0, 0]])
>>> np.eye(4,k=-1,dtype=int)
array([[0, 0, 0, 0],
   [1, 0, 0, 0],
   [0, 1, 0, 0],
   [0, 0, 1, 0]])
>>> np.eye(4,3,k=1)
array([[0., 1., 0.],
   [0., 0., 1.],
   [0., 0., 0.],
   [0., 0., 0.]])

26.np.dientity(n,dtype=None)

函数说明:生成单位方阵(M=N=n),与np.eye的区别是没有M与k的选项赋值.

实例:

>>> np.identity(4,dtype=int)
array([[1, 0, 0, 0],
   [0, 1, 0, 0],
   [0, 0, 1, 0],
   [0, 0, 0, 1]])

27.np.meshgrid(x1,x2...xn,sparse=False)

函数说明:生成网格点坐标矩阵。

参数说明:x1,x2....xn表示输入的每个维度向量,sparse表示是否返回稀疏网络以节省内存,默认为False。

个人理解:在对数据进行索引的时候例如上面讲过的整数/冒号/花式索引等,需要知道每个元素在每个维度的坐标值,例如2*2的矩阵[[1,2],[3,4]],的元素值1所在位置为(0,0),元素值2:(0,1),元素值3:(1,0),元素值4:(1,1),因此

     因此可知,每个元素都有对应的在每个维度的索引值。此函数的作用是得到二维/三维/n维度空间内每个元素在每个维度的索引值,常常用在生成元素的坐标索引值,比如在SSD网络中生成anchor的时候。

实例:

>>> a=np.arange(12,dtype=int).reshape(4,3)
>>> a
array([[ 0, 1, 2],
   [ 3, 4, 5],
   [ 6, 7, 8],
   [ 9, 10, 11]])
>>> x=np.arange(4)
>>> x
array([0, 1, 2, 3])
>>> y=np.arange(3)
>>> id1,id0=np.meshgrid(x,y)
>>> id0
array([[0, 0, 0, 0],
   [1, 1, 1, 1],
   [2, 2, 2, 2]])

#说明:每个元素的行坐标值
>>> id1
array([[0, 1, 2, 3],
   [0, 1, 2, 3],
   [0, 1, 2, 3]])

#说明:每个元素的列坐标值

28.np.where(condition,x,y)

函数说明:根据condition条件选择元素,条件为真则返回x,否则返回y。也可以只使用一个condition参数,返回的是索引号。

 实例说明:

#只有一个参数condition,返回索引值,可以是数组索引的方式取值

#condition是一维值,返回的是每个符合要求的元素的一维索引值。

>>> a=np.arange(10,dtype=int)
>>> mask=np.where(a>5)

>>> mask
(array([6, 7, 8, 9]),)

>>> a[mask]
array([6, 7, 8, 9])

#conditiion是二维的返回的是每个符合要求的元素的二维索引值。

>>> a=np.arange(12,dtype=int).reshape(3,4)
>>> mask=np.where(a>5)
>>> mask
(array([1, 1, 2, 2, 2, 2]), array([2, 3, 0, 1, 2, 3]))
>>> a[mask]
array([ 6, 7, 8, 9, 10, 11])

#包含condition,x,y三个元素。

>>> a=np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> condition=a>5
>>> condition
array([False, False, False, False, False, False, True, True, True,True])

>>> np.where(condition,1,0)
array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1])

>>> np.where(condition,a,a*10)
array([ 0, 10, 20, 30, 40, 50, 6, 7, 8, 9])

>>> np.where([[True,False],[True,True]],[[1,2],[3,4]],[[9,1],[2,3]])
array([[1, 1],
   [3, 4]])

>>> np.where(a<4,a,0)#带有广播性质
array([0, 1, 2, 3, 0, 0, 0, 0, 0, 0])

未完待续

推荐阅读