基于第二个数组在一个数组中查找项目

时间:2012-07-27 17:57:17

标签: python numpy

我有两个数组AB

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)

我意识到这需要采取多个步骤,但我无法真正地利用索引矩阵来总结另一个矩阵中的那些位置。

5 个答案:

答案 0 :(得分:4)

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

A[B == x].sum()

示例:

>>> A[B == 1.0].sum()
19.0

答案 1 :(得分: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)]

答案 2 :(得分: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.]

答案 3 :(得分: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

答案 4 :(得分:0)

我找到了旧问题here

其中一个answer

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)