2016-09-20 8 views
2

から特定の値を持つ配列の平均:計算は、私はこれらのnumpyの配列を持っている別の配列

array1 = np.array([-1, -1, 1, 1, 2, 1, 2, 2]) 
array2 = np.array([34.2, 11.2, 22.1, 78.2, 55.0, 66.87, 33.3, 11.56]) 

は今、私は私の出力が希望して配列1からそれぞれ独特の値の平均がである2D配列を返すようにしたいですこのような何かを見て:

array([[-1, 22.7], 
     [ 1, 55.7], 
     [ 2, 33.3]]) 

は、1つの2Dアレイにそれらの1D配列を連結することなく、効率的な方法はありますか?ありがとう!

答えて

1

ここnp.uniqueを使ったアプローチだとnp.bincount -

# Get unique array1 elems, tag them starting from 0 and get their tag counts 
unq,ids,count = np.unique(array1,return_inverse=True,return_counts=True) 

# Use the tags/IDs to perform ID based summation of array2 elems and 
# thus divide by the ID counts to get ID based average values 
out = np.column_stack((unq,np.bincount(ids,array2)/count)) 

サンプル実行 -

In [16]: array1 = np.array([-1, -1, 1, 1, 2, 1, 2, 2]) 
    ...: array2 = np.array([34.2, 11.2, 22.1, 78.2, 55.0, 66.87, 33.3, 11.56]) 
    ...: 

In [18]: out 
Out[18]: 
array([[ -1.  , 22.7  ], 
     [ 1.  , 55.72333333], 
     [ 2.  , 33.28666667]]) 
1

これは典型的なグループ化操作で、numpy_indexedパッケージ(免責事項:私はその作者だが)の拡張機能を提供しますこれらの操作を効率的かつ簡潔に行うにはnumpyに設定します。

import numpy_indexed as npi 
groups, means = npi.group_by(array_1).mean(array_2) 

このように、たとえば中央値など、他の種類の縮小も簡単に実行できます。

関連する問題