4

我有两个数组AB

A=array([[ 5.,  5.,  5.],
         [ 8.,  9.,  9.]])
B=array([[ 1.,  1.,  2.],
         [ 3.,  2.,  1.]])

任何有“1”的地方B我都想对A.

因此,例如对于这个答案将是 5+5+9=10

我希望这继续 2,3....n (所有唯一值B

所以对于 2 的......它将是 9+5=14 而对于 3 的它将是 8

我使用以下方法找到了唯一值:

numpy.unique(B)

我意识到这需要多个步骤,但我无法真正使用索引矩阵将这些位置汇总到另一个矩阵中。

4

5 回答 5

4

对于每个唯一值x,您可以执行

A[B == x].sum()

例子:

>>> A[B == 1.0].sum()
19.0
于 2012-07-27T17:58:51.917 回答
1

我想numpy.bincount这就是你想要的。如果 B 是一个小整数数组,例如您的示例,您可以执行以下操作:

import numpy
A = numpy.array([[ 5.,  5.,  5.],
                 [ 8.,  9.,  9.]])
B = numpy.array([[ 1,  1,  2],
                 [ 3,  2,  1]])
print numpy.bincount(B.ravel(), weights=A.ravel())
# [  0.  19.  14.   8.]

或者如果 B 除了小整数之外还有其他东西,你可以做这样的事情

import numpy
A = numpy.array([[ 5.,  5.,  5.],
                 [ 8.,  9.,  9.]])
B = numpy.array([[ 1.,  1.,  2.],
                 [ 3.,  2.,  1.]])
uniqB, inverse = numpy.unique(B, return_inverse=True)
print uniqB, numpy.bincount(inverse, weights=A.ravel())
# [ 1.  2.  3.] [ 19.  14.   8.]
于 2012-07-27T21:37:39.410 回答
1

[(val, np.sum(A[B==val])) for val in np.unique(B)]给你一个元组列表,其中第一个元素是 B 中的唯一值之一,第二个元素是 A 中元素的总和,其中 B 中的相应值是该值。

>>> [(val, np.sum(A[B==val])) for val in np.unique(B)]
[(1.0, 19.0), (2.0, 14.0), (3.0, 8.0)]

关键是您可以A[B==val]用来访问 A 中 B 等于 val 的位置的项目。

编辑:如果你只想要总和,就做[np.sum(A[B==val]) for val in np.unique(B)].

于 2012-07-27T18:00:38.313 回答
0

我会使用 numpy 掩码数组。这些是标准的 numpy 数组,带有与之关联的掩码,以阻止某些值。该过程非常简单,使用

numpy.ma.masked_array(data, mask)

其中掩码是通过使用掩码函数生成的

mask = numpy.ma.masked_not_equal(B, 1).mask

和数据是A

for i in numpy.unique(B):
    print numpy.ma.masked_array(A, numpy.ma.masked_not_equal(B, i).mask).sum()

19.0
14.0
8.0
于 2012-07-27T18:09:37.433 回答
0

我在这里找到了老问题

答案之一

def sum_by_group(values, groups):
 order = np.argsort(groups)
 groups = groups[order]
 values = values[order]
 values.cumsum(out=values)
 index = np.ones(len(groups), 'bool')
 index[:-1] = groups[1:] != groups[:-1]
 values = values[index]
 groups = groups[index]
 values[1:] = values[1:] - values[:-1]
 return values, groups

在你的情况下,你可以展平你的阵列

aflat = A.flatten()
bflat = B.flatten()
sum_by_group(aflat, bflat)
于 2016-07-21T14:22:06.107 回答