numpy二维数组的块平均值

Nik*_*Nik 7 python numpy matrix mean reshape

我想在NumPy中找到2D数组的块平均值.为简单起见,我们假设数组如下:

array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])
Run Code Online (Sandbox Code Playgroud)

我想将这个数组分成3个大小为2x4的块,然后找到所有三个块的平均值(这样平均值的形状是2x4.第一个块由前4列组成,下一个由下一个列组成4列等等.所以我的块是:

array([[0, 1, 2, 3],
       [12, 13, 14, 15]])

array([[ 4,  5,  6,  7],
       [16, 17, 18, 19]])

array([[ 8,  9, 10, 11],
       [20, 21, 22, 23]])
Run Code Online (Sandbox Code Playgroud)

我可以使用循环来做到这一点但我觉得最好先将这个数组转换成3D数组reshape,然后mean沿着第三个轴使用3D数组上的方法.这可能类似于这个问题.

如果有人能提供给我,我将不胜感激:

1).如果存在这样的技巧,那么执行块的适当Pythonic命令意味着甚至不转换为3D.

2).如果没有合适的Pythonic命令来进行2D到3D转换.

3).通过使用循环或使用上述命令来了解它是否更有效(在空间方面).

Jai*_*ime 5

Numpy 方法几乎总是会击败 python 循环,所以我将跳过你的 1.

至于 2,在这种特殊情况下,以下工作:

a = np.array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11],
              [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])
a = a.reshape(2, 3, 4)
>>> a
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
>>> np.mean(a, axis=1)
array([[  4.,   5.,   6.,   7.],
       [ 16.,  17.,  18.,  19.]])
Run Code Online (Sandbox Code Playgroud)

诀窍在于reshape. 对于需要n列块的一般情况,以下是一个选项

a = a.reshape((a.shape[0], -1, n))
Run Code Online (Sandbox Code Playgroud)

您在 3 中的担忧大多是没有根据的。reshape返回原始数组的视图,而不是副本,因此转换为 3D 只需要更改数组的shapestrides属性,而无需复制任何实际数据。

编辑 为了确保重塑不会复制数组,而是返回一个视图,请按照以下方式进行重塑

a.shape = a = a.reshape((a.shape[0], -1, n))
Run Code Online (Sandbox Code Playgroud)

文档中的示例遵循以下原则:

>>> a = np.arange(12).reshape(3,4)
>>> b = a.T
>>> b.shape = (12,)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: incompatible shape for a non-contiguous array
Run Code Online (Sandbox Code Playgroud)

而在一般只有问题,如果你一直在做transposerollaxisswapaxes或像你的阵列上。