4

私は2つの配列を持ってい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になります

Bこれを2,3....n(のすべての一意の値)の間継続したいと思います

つまり、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 の一意の値の 1 つであり、2 番目の要素が B の対応する値がその値である A の要素の合計であるタプルのリストを提供します。

>>> [(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.sum(A[B==val]) for val in np.unique(B)].

于 2012-07-27T18:00:38.313 に答える
0

派手なマスク配列を使用します。これらは、特定の値をブロックするマスクが関連付けられた標準的な 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 に答える