【问题标题】:average numpy array but retain shape平均numpy数组但保持形状
【发布时间】:2012-05-09 17:41:56
【问题描述】:

我有一个 Numpy 3 轴数组,其元素是 3 维的。我想对它们进行平均并返回相同形状的数组。正常的平均函数去掉3维,用平均值代替(如预期的那样):

a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]],
              [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32)

b = np.average(a, axis=2)
# b = [[0.2, 0.3],
#      [0.4, 0.7]]

需要结果

# b = [[[0.2, 0.2, 0.2], [0.3, 0.3, 0.3]],
#      [[0.4, 0.4, 0.4], [0.7, 0.7, 0.7]]]

你能优雅地做到这一点,还是我只需要在 Python 中迭代数组(与强大的 Numpy 函数相比会慢很多)。

您能否将 np.mean 函数的 Dtype 参数设置为一维数组?

谢谢。

【问题讨论】:

  • 非常喜欢你想在问题中看到的内容。
  • 在大多数情况下我可以想象,广播不需要 3d 数组就可以做到。

标签: python multidimensional-array numpy shape average


【解决方案1】:

好的,注意我还没有 numpyology 的硕士学位,但只是在玩,我想出了:

>>> np.average(a,axis=-1).repeat(a.shape[-1]).reshape(a.shape)
array([[[ 0.2       ,  0.2       ,  0.2       ],
        [ 0.29999998,  0.29999998,  0.29999998]],

       [[ 0.40000001,  0.40000001,  0.40000001],
        [ 0.69999999,  0.69999999,  0.69999999]]], dtype=float32)

【讨论】:

  • 我喜欢它,这比我想出的要好。
  • 这是一条线,它适用于所有数组形状和大小,只要您沿最后一个轴取平均值。
【解决方案2】:

您是否考虑过使用广播? Here 是有关广播的更多信息,如果您不熟悉这个概念。

这里是一个使用broadcast_arrays的例子,记住broadcast_arrays在这里产生的b应该被视为只读的,如果你想写的话你应该复制一份:

>>> b = np.average(a, axis=2)[:, :, np.newaxis]
>>> b, _ = np.broadcast_arrays(b, a)
>>> b
array([[[ 0.2       ,  0.2       ,  0.2       ],
        [ 0.29999998,  0.29999998,  0.29999998]],

       [[ 0.40000001,  0.40000001,  0.40000001],
        [ 0.69999999,  0.69999999,  0.69999999]]], dtype=float32)

【讨论】:

    【解决方案3】:
    >>> import numpy as np
    >>> a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]],
    ...               [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32)
    >>> b = np.average(a, axis=2)
    >>> b
    array([[ 0.2       ,  0.29999998],
           [ 0.40000001,  0.69999999]], dtype=float32)
    >>> c = np.dstack((b, b, b))
    >>> c
    array([[[ 0.2       ,  0.2       ,  0.2       ],
            [ 0.29999998,  0.29999998,  0.29999998]],
    
           [[ 0.40000001,  0.40000001,  0.40000001],
            [ 0.69999999,  0.69999999,  0.69999999]]], dtype=float32)
    

    【讨论】:

      【解决方案4】:

      这是一种避免复制的方法:

      a = a.T
      a[:] = a.mean(axis=0)
      a = a.T
      

      或者如果你不想覆盖a

      b = np.empty_like(a)
      b = b.T
      b[:] = a.mean(axis=-1).T
      b = b.T
      

      【讨论】:

      • 另一个很好的答案。我该如何选择?!谢谢! :)
      【解决方案5】:

      这是一个任意轴:

      array 是维度数组 axis 是平均轴

      np.repeat( np.expand_dims( np.mean( array, axis ), axis ), array.shape[axis], axis )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-04
        • 2011-06-05
        • 2016-11-20
        • 2014-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-12
        相关资源
        最近更新 更多