NumPy数组的每列中的负元素的总和

noa*_*hal 2 python arrays numpy sum

你知道如何总结NumPy数组的每一列中的所有负面元素.例如

>>> d
array([[ 1,  2,  3],
       [-1, -1,  9],
       [ 7, -6,  4]])
Run Code Online (Sandbox Code Playgroud)

我需要得到[-1,-7,0].有这样的功能吗?

Div*_*kar 6

可以提出的方法很少,如下所示 -

((d<0)*d).sum(0)
np.where(d<0,d,0).sum(0)
np.einsum('ij,ij->j',d<0,d)
((d - np.abs(d)).sum(0))/2
Run Code Online (Sandbox Code Playgroud)

逐步运行示例并解释所有这些方法 -

1)输入数组:

In [3]: d
Out[3]: 
array([[ 1,  2,  3],
       [-1, -1,  9],
       [ 7, -6,  4]])
Run Code Online (Sandbox Code Playgroud)

2)负面元素面具:

In [4]: d<0
Out[4]: 
array([[False, False, False],
       [ True,  True, False],
       [False,  True, False]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

3)使用逐元素乘法从输入数组中获取屏蔽的负元素:

In [5]: (d<0)*d
Out[5]: 
array([[ 0,  0,  0],
       [-1, -1,  0],
       [ 0, -6,  0]])
Run Code Online (Sandbox Code Playgroud)

4)最后,总结axis=0每列:

In [6]: ((d<0)*d).sum(axis=0) # Or simply ((d<0)*d).sum(0)
Out[6]: array([-1, -7,  0])
Run Code Online (Sandbox Code Playgroud)

方法#2:3)通过以下方式获得步骤(3)结果np.where:

In [7]: np.where(d<0,d,0)
Out[7]: 
array([[ 0,  0,  0],
       [-1, -1,  0],
       [ 0, -6,  0]])
Run Code Online (Sandbox Code Playgroud)

方法#3:3,4)在掩码和数组之间执行元素乘法并得到求和,所有这一切都在一步中使用np.einsum-

In [8]: np.einsum('ij,ij->j',d<0,d)
Out[8]: array([-1, -7,  0])
Run Code Online (Sandbox Code Playgroud)

方法#4:获取输入数组的绝对值并从数组本身中减去,给出我们双重的负数元素和正值被抵消:

In [9]: d - np.abs(d)
Out[9]: 
array([[  0,   0,   0],
       [ -2,  -2,   0],
       [  0, -12,   0]])
Run Code Online (Sandbox Code Playgroud)

对每个列求和并除以2以获得所需的输出:

In [10]: (d - np.abs(d)).sum(0)
Out[10]: array([ -2, -14,   0])

In [11]: ((d - np.abs(d)).sum(0))/2
Out[11]: array([-1, -7,  0])
Run Code Online (Sandbox Code Playgroud)