我有以下 numpy 数组:
import numpy as np
arr = np.array([[1,2,3,4,2000],
[5,6,7,8,2000],
[9,0,1,2,2001],
[3,4,5,6,2001],
[7,8,9,0,2002],
[1,2,3,4,2002],
[5,6,7,8,2003],
[9,0,1,2,2003]
])
我理解 np.sum(arr, axis=0)
提供结果:
array([ 40, 28, 36, 34, 16012])
我想做 的(没有 for 循环)是根据最后一列的值对列求和,以便提供的结果是:
array([[ 6, 8, 10, 12, 4000],
[ 12, 4, 6, 8, 4002],
[ 8, 10, 12, 4, 4004],
[ 14, 6, 8, 10, 4006]])
我意识到没有循环可能会很困难,但希望最好……
如果必须使用 for 循环,那将如何工作?
我尝试 np.sum(arr[:, 4]==2000, axis=0)
(我将用for循环中的变量替换 2000
),但是它给出了 2
的结果
原文由 Infinity Cliff 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用
np.diff
和np.add.reduceat
的巧妙应用在纯 numpy 中执行此操作。np.diff
将为您提供最右侧列发生变化的索引:np.where
会将您的布尔索引d
转换为np.add.reduceat
期望的整数索引:reduceat
也将期望看到零索引,并且所有内容都需要移动一个:使用
np.r_
这里比np.concatenate
更方便一点,因为它允许标量。然后总和变为:这当然可以组合成一个单行: