2016-09-20 56 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,所以我的輸出將每個獨特值的平均值看起來像這樣:

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

有沒有一個有效的方式,而不是將這些一維數組連接到一個二維數組?謝謝!

回答

1

下面是使用np.uniquenp.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包(免責聲明:我是它的作者)提供了擴展以高效簡潔地進行這些類型的操作:

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

請注意,您可以通過這種方式輕鬆地執行其他類型的減少,例如中位數。

相關問題