numpy杂记

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的其他维度必须相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值