【问题标题】:Numpy: average over one dimension in "jagged" 3D arrayNumpy:“锯齿状”3D数组中的一维平均值
【发布时间】:2014-01-01 13:33:39
【问题描述】:

假设我有一个 N*M*X 维数组“data”,其中 N 和 M 是固定的,但 X 对于每个条目 data[n][m] 是可变的。

(编辑:澄清一下,我只是在用于读取数据的 3D python 列表上使用了 np.array(),因此 numpy 数组的维度为 N*M,其条目是可变长度列表)

我现在想计算 X 维上的平均值,这样我就得到了一个 N*M 维数组。将 np.average/mean 与轴参数一起使用是行不通的,所以我现在这样做的方式只是遍历 N 和 M 并将手动计算的平均值附加到一个新列表中,但这并没有感觉很“蟒蛇”:

avgData=[]
for n in data:
    temp=[]
    for m in n:
        temp.append(np.average(m))
    avgData.append(temp)

我在这里遗漏了一些明显的东西吗?我正在尝试更新我的 Python 技能,因此非常欢迎有趣/多样的回答! :)

谢谢!

【问题讨论】:

  • 数据是如何存储的? numpy 没有提供任何方法来处理锯齿状数组(就 numpy 而言,X 始终是一个常量),因此您必须使用 something 或使用掩码数组或 . ..
  • @mgilson 编辑了问题。我刚刚有一个 3D python 列表并在上面调用了 np.array() 。所以我猜这是列表对象的二维数组?
  • 如果你不知道数据是如何布局的,我们应该怎么做?您可以使用数组的.shape.dtype 属性来检查这一点。

标签: python arrays numpy jagged-arrays multidimensional-array


【解决方案1】:

np.vectorize怎么样:

do_avg = np.vectorize(np.average)
data_2d = do_avg(data)

【讨论】:

    【解决方案2】:
    data = np.array([[1,2,3],[0,3,2,4],[0,2],[1]]).reshape(2,2)
    avg=np.zeros(data.shape)
    avg.flat=[np.average(x) for x in data.flat]
    print avg
    #array([[ 2.  ,  2.25],
    #       [ 1.  ,  1.  ]])
    

    这仍然会迭代数据的元素(没有什么非 Pythonic 的)。但是由于datashapeaxes 没有什么特别之处,所以我只使用data.flat。在附加到 Python list 时,使用 numpy 时最好将值分配给现有数组的元素。

    有一些快速的数字方法可以处理 numpy 数组,但大多数(如果不是全部)都可以处理简单的数字 dtypes。这里的数组元素是object(列表或数组),numpy 不得不求助于通常的 Python 迭代和列表操作。

    对于这个小例子,这个解决方案比 Zwicker 的 vectorize 快一点。对于较大的data,这两种解决方案大约需要相同的时间。

    【讨论】:

    • 有趣!我考虑过使用重塑,但不太清楚如何。我并不是说迭代元素不是非 Python 的,只是会有一个比使用 for 循环更清晰的解决方案。
    • 无论是在编译函数中、隐藏在 Python 函数中还是显式地,都会有一个循环。如果第 3 维不是锯齿状的,它将是一个真正的 3d 数组,您可以简单地在第 3 维上进行平均。我应该深入研究vectorize,看看它是如何隐藏循环的。
    猜你喜欢
    • 2016-11-20
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多