这是我的数据:
a = np.array([[1,2],[2,1],[7,1],[3,2]])
我想对此处第二行中的每个数字求和。因此,在示例中,第二列中有两个可能的值:1 和 2。
我想对第一列中与第二列中具有相同值的所有值求和。 有内置的 numpy 函数吗?
例如,第二列中每个 1 的总和为:2 + 7 = 9
请您参考如下方法:
一个简短但有点狡猾的方法是通过 numpy 函数 bincount:
np.bincount(a[:,1], weights=a[:,0])
它的作用是计算数组中 0、1、2 等的出现次数(在本例中,a[:,1] 是类别编号的列表) .现在,weights 将计数乘以某个权重,在本例中是您在列表中的第一个值,本质上是通过这种方式求和。
它返回的是这样的:
array([ 0., 9., 4.])
其中 0 是第一个元素的总和,第二个元素是 0,依此类推...因此,只有当您分组的第二个数字是整数时,它才会起作用。
如果它们不是从0开始的连续整数,你可以通过以下方式选择你需要的:
np.bincount(a[:,1], weights=a[:,0])[np.unique(a[:,1])]
这将返回
array([9., 4.])
这是一个总和数组,按第二个元素排序(因为 unique 返回一个排序列表)。
如果你的第二个元素不是整数,首先你会因为 floating point arithmetic 而陷入某种麻烦。 (您认为相同的元素实际上可能不同)。但是,如果您确定它没问题,您可以对它们进行排序并为它们分配整数(例如使用 scipy 的 rank 函数):
ind = rd(a[:,1], method = 'dense').astype(int) - 1 # ranking begins from 1, we need from 0
sums = np.bincount(ind, weights=a[:,0])
这将返回 array([9., 4.]),按第二个元素排序。您可以压缩它们以将总和与适当的元素配对:
zip(np.unique(a[:,1]), sums)
