Python 基于第二个数组查找一个数组中的项

Python 基于第二个数组查找一个数组中的项,python,numpy,Python,Numpy,我有两个数组A和B: A=array([[ 5., 5., 5.], [ 8., 9., 9.]]) B=array([[ 1., 1., 2.], [ 3., 2., 1.]]) 如果B中有一个“1”,我想对a中相同的行和列位置求和 举个例子,这个答案是5+5+9=10 我希望这种情况持续2,3…n(B中的所有唯一值) 所以对于2的。。。它将是9+5=14,对于3,它将是8 我使用以下方法找到了唯一的值: numpy.unique(B)

我有两个数组
A
B

A=array([[ 5.,  5.,  5.],
         [ 8.,  9.,  9.]])
B=array([[ 1.,  1.,  2.],
         [ 3.,  2.,  1.]])
如果
B
中有一个“1”,我想对
a
中相同的行和列位置求和

举个例子,这个答案是5+5+9=10

我希望这种情况持续2,3…n(B中的所有唯一值)

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

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

numpy.unique(B)

我意识到这需要采取多个步骤,但我不能真正用索引矩阵将另一个矩阵中的位置相加。

对于每个唯一值
x
,您可以这样做

A[B == x].sum()
例如:

>>> A[B == 1.0].sum()
19.0
[(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]
在B等于val的位置访问A中的项


编辑:如果您只需要求和,只需对np.unique(B)中的val执行
[np.sum(A[B==val])

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

numpy.ma.masked_array(data, mask)
其中,掩码是通过使用掩码函数生成的

mask = numpy.ma.masked_not_equal(B, 1).mask
而数据是一种

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

我认为
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.]
我发现了一个老问题

其中一个

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

aflat = A.flatten()
bflat = B.flatten()
sum_by_group(aflat, bflat)

我想你的意思是
5+5+9=19
:-)这正是我想要的,但由于某种原因,我一直得到“数组不能安全地转换为所需类型”你知道我为什么会一直得到这个错误吗?谢谢@BagoNevermind,我认为这是因为它是一个浮点而不是一个int。不过我确实喜欢这个输出,因为如果没有匹配项,我需要它有一个“0”,这样列间距就不会超出范围。您可以始终执行numpy.bincount(B.ravel().astype('int'),weights=a.ravel())如果你有一个浮点数数组,你知道可以安全地将其转换为int。我将如何得到输出:
[0.19.14.8.]
,这是否也会将0放在数组B中没有任何内容的位置?@Ericscobar,请参阅我编辑过的答案。如果您希望0表示B中缺少的元素,则需要更加具体。显然,有无限多的值不存在于B中,所以你需要说出你期望在B中出现的值。
aflat = A.flatten()
bflat = B.flatten()
sum_by_group(aflat, bflat)