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,=float,='C')
函数说明:用来创建指定大小的元素为0的数组
实例:
>>> np.zeros(shape=(2,3))
array([[0., 0., 0.],
[0., 0., 0.]])
3.numpy.ones(shape,=None,='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=,initial=,where=)
函数说明:求目标数组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=,initial=,where=)
函数说明:求目标数组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=,initial=,where=)
函数说明:求目标数组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=,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])
未完待续