2016-10-29 160 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