0

すべて同じサイズの 3 つの配列があります。

arr1 = np.array([1.4, 3.0, 4.0, 4.0, 7.0, 9.0, 9.0, 9.0])
arr2 = np.array([2.3, 5.0, 2.3, 2.3, 4.0, 6.0, 5.0, 6.0])
data = np.array([5.4, 7.1, 9.5, 1.9, 8.7, 1.8, 6.1, 7.4])

arr1 は任意の float 値を使用でき、arr2 は数個の float 値のみを使用できます。arr1 と arr2 の一意のペアを取得したい、例えば

arr1unique = np.array([1.4, 3.0, 4.0, 7.0, 9.0, 9.0])
arr2unique = np.array([2.3, 5.0, 2.3, 4.0, 6.0, 5.0])

一意ではないペアごとに、配列内の対応する要素を平均化する必要があります。たとえば、ペアとが等しいdataため、値 9.5 と 1.9 を平均化します。同じことがインデックス 6 と 8 に対応するデータの値にも当てはまります。したがって、データ配列は次のようになります。(arr1[3], arr2[3])(arr1[4], arr2[4])

dataunique = np.array([5.4, 7.1, 5.7, 8.7, 4.6, 6.1])
4

4 に答える 4

1

これは、問題に対する「純粋なnumpy」ソリューションです。私がまだ取り組んでいるnumpy拡張提案に依存しているため、引用符で囲まれた純粋なnumpyですが、ここで完全なコードを見つけることができます:

http://pastebin.com/c5WLWPbp

group_by((arr1, arr2)).mean(data)

出来上がり、問題は解決しました。投稿されたどのソリューションよりもはるかに高速です。私がそう言うかもしれませんが、はるかにエレガントです;)。

于 2014-02-08T06:38:11.620 に答える
0

OrderedDictキーを要素のペアとして (arr1,arr2) に格納し、値を要素のリストとして data に格納する を作成するだけです。重複キー (arr1 と arr2 のペア) の場合、重複エントリがリストに格納されます。その後、ディクショナリ内の値を再走査して平均を作成できます。一意のキーを取得するには、キーを反復処理してタプルを分割するだけです

以下を試してください

>>> d=collections.OrderedDict()
>>> for k1,k2,v in zip(arr1,arr2,data):
    d.setdefault((k1,k2),[]).append(v)      
>>> np.array([np.mean(v) for v in d.values()])
array([ 5.4,  7.1,  5.7,  8.7,  4.6,  6.1])

>>> arr1unique = np.array([e[0] for e in d])
>>> arr2unique = np.array([e[1] for e in d])
于 2012-05-02T08:55:13.570 に答える
0

defaultdictここであなたを助けることができます:

>>> import numpy as np
>>> arr1 = np.array([1.4, 3.0, 4.0, 4.0, 7.0, 9.0, 9.0, 9.0])
>>> arr2 = np.array([2.3, 5.0, 2.3, 2.3, 4.0, 6.0, 5.0, 6.0])
>>> data = np.array([5.4, 7.1, 9.5, 1.9, 8.7, 1.8, 6.1, 7.4])
>>> from collections import defaultdict
>>> dd = defaultdict(list)
>>> for x1, x2, d in zip(arr1, arr2, data):
...   dd[x1, x2].append(d)
... 
>>> arr1unique = np.array([x[0] for x in dd.iterkeys()])
>>> arr2unique = np.array([x[1] for x in dd.iterkeys()])
>>> dataunique = np.array([np.mean(x) for x in dd.itervalues()])
>>> print arr1unique
[ 1.4  7.   4.   9.   9.   3. ]
>>> print arr2unique
[ 2.3  4.   2.3  5.   6.   5. ]
>>> print dataunique
[ 5.4  8.7  5.7  6.1  4.6  7.1]

この方法では答えが得られますが、順序が崩れます。順序が重要な場合は、基本的に同じことができますcollections.OrderedDict

于 2012-05-02T08:52:50.547 に答える