np.expand_dims(); np.maximum(x,y,out=None); np.concatenate();np.any();np.all()

np.expand_dims()

用来扩充维度,典型应用是将一维向量转化成二维矩阵
比如[1,2,3]的shape是(3)
可以转化成[[1,2,3]]shape是(1,3)
或者转化成[[1],[2],[3]] shape是(3,1)
在两个向量想broadcast的时候,由于只能进行矩阵和向量之间的broadcast,所以我们需要expand_dims()对其中一个向量进行维度扩充,再broadcast

a=np.array([1,2,3])
b=np.expand_dims(a,axis=0)
#在axis=0扩充维度(3)变成(1,3), b=[[1,2,3]]
c=b=np.expand_dims(a,axis=1)
#在axis=1扩充维度(3,)变成(3,1), c=[[1],[2],[3]] 
a=np.array([[0,0,1,1],[0,0,1,2],[0,0,2,2]])
b=np.array([[0,0,1,1],[0,0,1,2]])
假设我要对a[:,2]和b[:,3]做一个加法
如果直接进行c=a[:,3]+b[:,3]
会报错 a[:,2]+b[:,3]
ValueError: operands could not be broadcast together with shapes (3,) (2,) 
如果我们用(3,1)形状的矩阵和(2,)形状的向量做加法,那么得到的会是(3,2)的矩阵
比如
np.expand_dims(a[:,2],axis=1)+b[:,3]
#[[1],[1],[2]]+[1,2] = [[1,1],[1,1],[2,2]]+[[1,2].[1,2],[1,2]] = 
Out[7]: 
array([[2, 3],
       [2, 3],
       [3, 4]])
同理
如果我们用(2,1)形状的矩阵和(3,)形状的向量做加法,那么得到的会是(2,3)的矩阵
np.expand_dims(b[:,3],axis=1)+a[:,2]
Out[8]: 
array([[2, 2, 3],
       [3, 3, 4]])

np.maximum()

与np.max()的比较
np.max:(a, axis=None, out=None, keepdims=False)

  • 求序列的最值
    最少接收一个参数
    axis:默认为列向(也即 axis=0),axis = 1 时为行方向的最值;

np.maximum:(X, Y, out=None)

  • X 与 Y 逐位比较取其大者;
    最少接收两个参数x,y。注意out参数的意义
>> np.max([-2, -1, 0, 1, 2])
2
>> np.maximum([-2, -1, 0, 1, 2], 0)
array([0, 0, 0, 1, 2]
# 当然 np.maximum 接受的两个参数,也可以大小一致
# 或者更为准确地说,第二个参数只是一个单独的值时,其实是用到了维度的 broadcast 机制;
>>a=np.array([[1,2,3,4,5],[4,5,6,7,8]])
>>a.shape=(2,5)
>>np.maximum([-2, -1, 0, 1, 2], 0,out=a)
>>array([[0, 0, 0, 1, 2],[0, 0, 0, 1, 2]])
>>a=array([[0, 0, 0, 1, 2],[0, 0, 0, 1, 2]])
#所以out=a的意义就是用np.maximum(x,y)的结果去替换a,返回结果也是更新后的a,在这个过程#中,a的维度需要跟np.maximum(x,y)一致或者满足broadcasting条件。

np.concatenate()

连接两个矩阵的作用
假设a的shape是(3,2);b的shape是(3,5)
那么我们可以将a和b在行方向上级联,得到shape(3,7)的矩阵

c=np.concatenate((a,b),axis=1)

下面说一个简单应用
现在我有一个(N,7)的矩阵,其中(N,:4)表示四个坐标点,(N,4:)表示属于三个类的概率,我想将(N,7)转化为(N,5),新矩阵的最后一维表示属于哪一个类。
比如原矩阵是ori_matrix=[[1,2,3,4,0.1,0.2,0.7],[5,6,7,8,0.3,0.5,0.2]]
那么新矩阵为new_maxtrix=[[1,2,3,4,2],[5,6,7,8,1]]
代码如下

ori_matrix=[[1,2,3,4,0.1,0.2,0.7],[5,6,7,8,0.3,0.5,0.2]]
tmp1=ori_matrix[:,:4]
tmp2=np.argmax(ori_matrix[:,4:],axis=1)
tmp3=np.expand_dims(tmp1,axis=1)
new_matrix=np.concatenate((tmp1,tmp3),axis=1)

np.any(x,axis=None) np.all(x,axis=None)

确认是否有任意any一个元素为真 或者 全all为真
举个例子我想对三个类class0 class1 class2做一个置信度的thresholding
其中class0是背景类可以忽略,如果class1和class2都小于某个threshold比如0.3
那我们就忽略这一行的元素
代码如下

a=np.array([[0.7,0.2,0.1],[0.2,0.8,0],[0.4,0.5,0.1],[0.1,0.3,0.6]])
b=a[:,1:]
condition=(b>0.3).any(axis=1)
#axis=1 判断每一行是否有any大于0.3的元素
#array([False,  True,  True,  True])
a[condition]=
array([[0.2, 0.8, 0. ],
       [0.4, 0.5, 0.1],
       [0.1, 0.3, 0.6]])
b[condition]=
array([[0.8, 0. ],
       [0.5, 0.1],
       [0.3, 0.6]])

你可能感兴趣的:(python)