1. np.insert(arr, obj, values, axis=None):axis指定轴下顺序为obj行或列中插入values。
a = np.array([[1, 1], [2, 2], [3, 3]])
>>> a
array([[1, 1],
[2, 2],
[3, 3]])
>>> np.insert(a, 1, 5, axis=1)
array([[1, 5, 1],
[2, 5, 2],
[3, 5, 3]])
2. np.prob(a, axis) : 返回给定轴上的数组元素的乘积
在axis为默认情况下是计算a中所有元素的乘积:
>>> np.prod([[1.,2.],[3.,4.]]) 24.0
指定轴下:
>>> np.prod([[1.,2.],[3.,4.]], axis=1) array([ 2., 12.])
3.numpy中列表的用法:
...,包括了array中除了最后一维的元素
a= np.zeros((2,3,4,5))
a[...,:2].shape
output: (2, 3, 4, 2)
4. np.argsort(a,axis=-1, kind='quicksort', order=None)
返回将对数组进行排序的索引,axis用于指定特定的轴。
x = np.array([[6, 3], [2, 4]])
np.argsort(x, axis=0)
output : array([[1, 0],[0, 1]], dtype=int64)
x = np.array([[6, 3], [8, 4]])np.argsort(x, axis=1)output : array([[1, 0],[1, 0]], dtype=int64)
上面的索引是a中的elements按照从小到大的顺序排列的,可以使用reverse()函数来进行顺序改变:
x = np.array([[6, 3], [2, 4]])
list(reverse(np.argsort(x, axis=0)))
output : array([[0, 1],[1, 0]], dtype=int64)
5.np.linsapce(start, end, num, endpoint=True, retstep=False)
返回num个在start—end区间内均匀间隔的样本数。通过设置endpoint来指定样本中是否包括end。当retstep为True时,返回值中会添加样本间隔这一项。
np.linspace(2.0, 3.0, num=5)
output: array([ 2. , 2.25, 2.5 , 2.75, 3. ])
np.linspace(2.0, 3.0, num=5, endpoint=False)
output: array([ 2. , 2.2, 2.4, 2.6, 2.8])
np.linspace(2.0, 3.0, num=5, retstep=True)
output: (array([ 2. , 2.25, 2.5 , 2.75, 3. ]), 0.25)
6.np.where(condition, x, y )
当condition为Ture时返回x,False是返回y
In [3]: x = np.arange(9).reshape(3,3)#创建一个3×3的矩阵
In [4]: x
Out[4]:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
In [5]: np.where(x>4) #只输入condition
Out[5]: (array([1, 2, 2, 2], dtype=int64), array([2, 0, 1, 2], dtype=int64))
In [6]: np.where(x>7)# 只输入condition
Out[6]: (array([2], dtype=int64), array([2], dtype=int64))
当只输入condition时,返回的是满足条件元素相对应横纵坐标的值。第一个array返回的是横坐标的值,第二个array返回的是纵坐标的值。
In [8]: y = np.random.randn(3,3)
In [9]: y
Out[9]:
array([[ 1.59809956, -0.42735851, 1.46593089],
[-0.26497622, 0.53948157, -2.01569974],
[-0.11099139, -1.70616601, -1.34821361]])
In [10]: np.where(y > 0, 4, -4)
Out[10]:
array([[ 4, -4, 4],
[-4, 4, -4],
[-4, -4, -4]])
当输入目标时,则进行相应的目标替换。
7.[X, Y ] = np.meshgrid(array_x, array_y)
返回的是两个数组(矩阵)。假设array_x的长度为dim_x,array_y的长度为dim_y,X为dim_y行的array_x构成的矩阵,Y为dim_x的array_y构成的矩阵,实际上就是用两个矩阵中对应的点在二维平面上画网格。
m, n = (5, 3)
x = np.linspace(0, 1, m)
y = np.linspace(0, 1, n)
X, Y = np.meshgrid(x,y)
x
out:
array([ 0. , 0.25, 0.5 , 0.75, 1. ])
y
out:
array([ 0. , 0.5, 1. ])
X
out:
array([[ 0. , 0.25, 0.5 , 0.75, 1. ],
[ 0. , 0.25, 0.5 , 0.75, 1. ],
[ 0. , 0.25, 0.5 , 0.75, 1. ]])
Y
out:
array([[ 0. , 0. , 0. , 0. , 0. ],
[ 0.5, 0.5, 0.5, 0.5, 0.5],
[ 1. , 1. , 1. , 1. , 1. ]])
X.shape
out:
(3, 5)
Y.shape
out:
(3, 5)
可以看出返回的两个数组维度是相同的。理解的时候可以把X当做是横轴,Y当做是纵轴,则横轴上第一行的坐标为(0,0)、(0.25,0)、(0.5,0)、(0.75,0)、(1,0)。
可视化输出如下所示:
plt.plot(X, Y, marker='.', color='blue', linestyle='none')
plt.show()
此函数在目标检测代码中比较常见,用于生成feature map 上的网格坐标,在得到相应的default box 或者 anchors的坐标.
8.numpy中用bool索引来访问数组
>>> np.random.randn(3,4)
array([[-1.04969711, -0.8467145 , 1.59144771, -1.47314122],
[ 0.44017227, -0.13765327, -1.37396347, 0.09137891],
[ 0.44591065, -1.73671824, -0.16579167, -0.4779633 ]])
>>> x = a > 0
>>> x
array([[False, False, True, True],
[ True, True, False, False],
[ True, True, False, True]], dtype=bool)
>>> a[x]
array([ 0.70162617, 0.33904239, 2.93825791, 1.28104284, 1.12500501,
0.50476706, 0.80405862])
上面可以看出用得到的bool索引来访问时得到的结果是只留下索引对应为True的元素。
>>> a[x] = np.zeros((3,4))[x]
>>> a
array([[-1.04779432, -0.03246022, 0. , 0. ],
[ 0. , 0. , -1.19503198, -0.08445882],
[ 0. , 0. , -0.36921047, 0. ]])
当是需要改变原来的数组时,需要把bool索引也添加到原来的数组中。
9.np.ravel()和np.flatten()比较
两者的功能都是用来平铺数组,并且返回平铺后一维向量。
>>> a = np.random.randn(2,3)
>>> a
array([[-0.44627756, 0.2816067 , 0.64792275],
[ 0.25918995, 1.13949588, 0.42757998]])
>>> a.ravel()
array([-0.44627756, 0.2816067 , 0.64792275, 0.25918995, 1.13949588,
0.42757998])
>>> a
array([[-0.44627756, 0.2816067 , 0.64792275],
[ 0.25918995, 1.13949588, 0.42757998]])
>>> a.flatten()
array([-0.44627756, 0.2816067 , 0.64792275, 0.25918995, 1.13949588,
0.42757998])
>>> a
array([[-0.44627756, 0.2816067 , 0.64792275],
[ 0.25918995, 1.13949588, 0.42757998]])
可以看出是不改变原来数组a的值。
两者的区别:
>>> a
array([[-0.44627756, 0.2816067 , 0.64792275],
[ 0.25918995, 1.13949588, 0.42757998]])
>>> x = a
>>> y = x.ravel()
>>> x.ravel()[-1] = 300
>>> x
array([[ -4.46277560e-01, 2.81606699e-01, 6.47922754e-01],
[ 2.59189952e-01, 1.13949588e+00, 3.00000000e+02]])
>>> y
array([ -4.46277560e-01, 2.81606699e-01, 6.47922754e-01,
2.59189952e-01, 1.13949588e+00, 3.00000000e+02])
>>> a
array([[ -4.46277560e-01, 2.81606699e-01, 6.47922754e-01],
[ 2.59189952e-01, 1.13949588e+00, 3.00000000e+02]])
>>> a
array([[-0.44627756, 0.2816067 , 0.64792275],
[ 0.25918995, 1.13949588, 0.42757998]])
>>> x = a.flatten()
>>> x
array([-0.44627756, 0.2816067 , 0.64792275, 0.25918995, 1.13949588,
0.42757998])
>>> a.flatten()[-1] = 300
>>> a
array([[-0.44627756, 0.2816067 , 0.64792275],
[ 0.25918995, 1.13949588, 0.42757998]])
>>> x
array([-0.44627756, 0.2816067 , 0.64792275, 0.25918995, 1.13949588,
0.42757998])
可以看出ravel()在改变元素值的时候,与之有关数组的元素也会随之改变。
flatten()改变元素值的时候,与之相关的数组元素是不会改变的。
相当于ravel()返回的是一份引用,而flatten()返回的是一份拷贝。
10.np.concatenate((a,b), axis)
返回在指定axis上的两数组的连接值
>>> a = np.zeros((2,3))
>>> b = np.ones((4,3))
>>> c = np.ones((2,6))
>>> np.concatenate((a,b), axis=0)
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
>>> np.concatenate((a,c), axis=1)
array([[ 0., 0., 0., 1., 1., 1., 1., 1., 1.],
[ 0., 0., 0., 1., 1., 1., 1., 1., 1.]])
除了axis所对应的维度之外数组a、b的其他维度必须相同。