2016-10-29 226 views
2

當尺寸相同時,numpy平均函數可以很好地工作。numpy.mean不同的行尺寸

a = np.array([[1, 2], [3, 4]]) 
a.mean(axis=1) 
array([ 1.5, 3.5]) 

但是,如果我有varrying行大小做它,它提供了一個錯誤

a = np.array([[1, 2], [3, 4, 5]]) 
a.mean(axis=1) 
IndexError: tuple index out of range 

我不能找到有關這個問題的文件上的任何東西。我可以自己計算平均值,但是我想用這個函數的build,看看它應該是可能的。

+0

這第二種情況是對象的一維數組,列表。使它成爲一個數組並沒有太大的作用。你或者numpy,仍然必須把它當作一個列表清單。 – hpaulj

回答

1

這裏有一個方法 -

# Store length of each subarray 
lens = np.array(map(len,a)) 

# Generate IDs based on the lengths 
IDs = np.repeat(np.arange(len(lens)),lens) 

# Use IDs to do bin-based summing of a elems and divide by subarray lengths 
out = np.bincount(IDs,np.concatenate(a))/lens 

採樣運行 -

In [34]: a # Input array 
Out[34]: array([[1, 2], [3, 4, 5]], dtype=object) 

In [35]: lens = np.array(map(len,a)) 
    ...: IDs = np.repeat(np.arange(len(lens)),lens) 
    ...: out = np.bincount(IDs,np.concatenate(a))/lens 
    ...: 

In [36]: out # Average output 
Out[36]: array([ 1.5, 4. ]) 

簡單的替代方式使用列表理解 -

In [38]: [np.mean(i) for i in a] 
Out[38]: [1.5, 4.0] 
+0

這確實需要什麼,但這真的是最簡單的方法來解決這個問題嗎? – NicolaiF

+0

@NicolaiF爲此我們可以使用'list comprehension'作爲編輯添加的。 – Divakar

+0

感謝您的全面回答! – NicolaiF