2015-10-09 63 views
2

考慮一個簡單的記錄陣列結構:如何聚合NumPy記錄數組(總和,最小值,最大值等)?

import numpy as np 
ijv_dtype = [ 
    ('I', 'i'), 
    ('J', 'i'), 
    ('v', 'd'), 
] 
ijv = np.array([ 
    (0, 0, 3.3), 
    (0, 1, 1.1), 
    (0, 1, 4.4), 
    (1, 1, 2.2), 
    ], ijv_dtype) 
print(ijv) # [(0, 0, 3.3) (0, 1, 1.1) (0, 1, 4.4) (1, 1, 2.2)] 

我想從vaggregate某些統計(總和,最小值,最大值等)通過分組的IJ獨特組合。從SQL思維,預期的結果是:

select i, j, sum(v) as v from ijv group by i, j; 
i | j | v 
---+---+----- 
0 | 0 | 3.3 
0 | 1 | 5.5 
1 | 1 | 2.2 

(順序並不重要)

我能想起來的NumPy的是醜陋的最好的,和我沒有信心,我已經下令結果正確(雖然它似乎在這裏工作):

# Get unique groups, index and inverse 
u_ij, idx_ij, inv_ij = np.unique(ijv[['I', 'J']], return_index=True, return_inverse=True) 
# Assemble aggregate 
a_ijv = np.zeros(len(u_ij), ijv_dtype) 
a_ijv['I'] = u_ij['I'] 
a_ijv['J'] = u_ij['J'] 
a_ijv['v'] = [ijv['v'][inv_ij == i].sum() for i in range(len(u_ij))] 
print(a_ijv) # [(0, 0, 3.3) (0, 1, 5.5) (1, 1, 2.2)] 

我想有一個更好的方法來做到這一點!我正在使用NumPy 1.4.1。

+1

我第一次嘗試將使用'(i,j)'元組作爲關鍵字來收集'collections.default_dict(list)'中的數據。然後,我可以在每個列表上預製所需的統計數據。 – hpaulj

回答

1

numpy對於這樣的任務來說太低級了。我認爲您的解決方案是好的,如果你必須使用純numpy,但如果你不介意使用的東西與抽象的更高層次,嘗試pandas

import pandas as pd 

df = pd.DataFrame({ 
    'I': (0, 0, 0, 1), 
    'J': (0, 1, 1, 1), 
    'v': (3.3, 1.1, 4.4, 2.2)}) 

print(df) 
print(df.groupby(['I', 'J']).sum()) 

輸出:

I J v 
0 0 0 3.3 
1 0 1 1.1 
2 0 1 4.4 
3 1 1 2.2 
     v 
I J  
0 0 3.3 
    1 5.5 
1 1 2.2 
+0

隨着'numpy'的早期版本,'熊貓'可能不是一個選項。 – hpaulj

相關問題