我有两个数组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)
我意识到这需要采取多个步骤,但我无法真正地利用索引矩阵来总结另一个矩阵中的那些位置。
答案 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)