Python numpy中非对称阵列的方法

Python numpy中非对称阵列的方法,python,numpy,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/.virtu

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

有没有一个很好的方法可以做到这一点,或者我应该自己做数学吗?

您可以使用列表理解为每个foo子数组执行平均值:

mean_foo = np.array( [np.mean(subfoo) for subfoo in foo] )
正如@Kasramvd在另一个答案的评论中所建议的,您也可以使用map函数:

mean_foo = np.array( map(np.mean, foo) )

您可以使用列表对foo的每个子数组执行平均值:

mean_foo = np.array( [np.mean(subfoo) for subfoo in foo] )
正如@Kasramvd在另一个答案的评论中所建议的,您也可以使用map函数:

mean_foo = np.array( map(np.mean, foo) )

我们可以使用一种几乎矢量化的方法,基于该方法处理不规则长度的子阵列,我们正在计算其平均值。np.add.reduceat使用np.concatenate获得输入数组的1D展平版本后,对这些不规则长度间隔中的元素求和。最后,我们需要将总和除以这些子阵列的长度,以获得平均值

因此,实现看起来是这样的-

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)

我们可以使用一种几乎矢量化的方法,基于该方法处理不规则长度的子阵列,我们正在计算其平均值。np.add.reduceat使用np.concatenate获得输入数组的1D展平版本后,对这些不规则长度间隔中的元素求和。最后,我们需要将总和除以这些子阵列的长度,以获得平均值

因此,实现看起来是这样的-

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)

很明显,第一行的第二个轴中没有任何项目。如果要计算整个项目的平均值,可以将数组展平,然后计算平均值。是否可能重复?你在这里说的好方法是什么意思?高效还是简短/紧凑的代码?我想我很困惑,我认为轴是水平运行的,而不是垂直运行的。事实上,当我在对称数据集上运行它时,情况似乎就是这样,但可能我误读了它。不错,我的意思是坚持使用numpy,而不是自己写东西或使用stdlib的统计数据。很明显,第一行的第二个轴中没有任何项目。如果要计算整个项目的平均值,可以将数组展平,然后计算平均值。是否可能重复?你在这里说的好方法是什么意思?高效还是简短/紧凑的代码?我想我很困惑,我认为轴是水平运行的,而不是垂直运行的。事实上,当我在对称数据集上运行它时,情况似乎就是这样,但可能我误读了它。不错,我的意思是坚持使用numpy,而不是自己写东西或使用stdlib的统计数据。在处理内置函数时,最好使用map而不是列表理解。它的性能稍微快一点。@Kasramvd真棒!谢谢,添加到帖子中。在处理内置函数时,最好使用映射而不是列表理解。它的性能稍微快一点。@Kasramvd真棒!谢谢,添加到帖子中。