numpy中不对称数组的方法

时间:2016-09-20 12:07:06

标签: python numpy

我在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

有没有一种很好的方法可以做到这一点,还是我应该自己做数学?

2 个答案:

答案 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)