我在numpy中有一个非对称的2d数组,因为在某些数组中比其他数组长,例如:[[1, 2], [1, 2, 3], ...]
但numpy似乎不喜欢这样:
import numpy as np
foo = np.array([[1], [1, 2]])
foo.mean(axis=1)
回溯:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/tom/.virtualenvs/nlp/lib/python3.5/site-packages/numpy/core/_methods.py", line 56, in _mean
rcount = _count_reduce_items(arr, axis)
File "/home/tom/.virtualenvs/nlp/lib/python3.5/site-packages/numpy/core/_methods.py", line 50, in _count_reduce_items
items *= arr.shape[ax]
IndexError: tuple index out of range
有没有一种很好的方法可以做到这一点,还是我应该自己做数学?
答案 0 :(得分:2)
您可以使用列表解析执行foo的每个子数组的均值:
mean_foo = np.array( [np.mean(subfoo) for subfoo in foo] )
正如@Kasramvd在另一个回答的评论中所建议的那样,你也可以使用map
函数:
mean_foo = np.array( map(np.mean, foo) )
答案 1 :(得分:2)
我们可以使用基于np.add.reduceat
的几乎矢量化方法来处理不规则长度子阵列,我们正在计算平均值。 np.add.reduceat
在使用1D
获取输入数组的np.concatenate
展平版本后,对不规则长度的间隔中的元素进行求和。最后,我们需要将总和除以这些子阵列的长度以获得平均值。
因此,实现看起来像这样 -
lens = np.array(map(len,foo)) # Thanks to @Kasramvd on this!
vals = np.concatenate(foo)
shift_idx = np.append(0,lens[:-1].cumsum())
out = np.add.reduceat(vals,shift_idx)/lens.astype(float)