9

我想在 NumPy 中找到二维数组的块均值。为简单起见,我们假设数组如下:

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]])

我想把这个数组分成 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]])

我可以使用循环来执行此操作,但我觉得最好先将此数组转换为 3D 数组reshape,然后mean在沿第三轴的 3D 数组上使用该方法。这可能类似于这个问题

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

1)。如果存在这样的技巧,则执行块的适当 Pythonic 命令甚至无需转换为 3D。

2)。如果不是适当的 Pythonic 命令来执行 2D 到 3D 转换。

3)。了解使用循环或使用上面的命令是否会更有效(在空间方面)。

4

2 回答 2

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.]])

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

a = a.reshape((a.shape[0], -1, n))

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

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

a.shape = a = a.reshape((a.shape[0], -1, n))

文档中的示例大致如下:

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

通常,只有在阵列上执行 , 或类似操作时transpose才会rollaxis出现问题。swapaxes

于 2013-01-09T06:12:02.510 回答
-1

我可以回答你的号码 1)。

vstack([mean(a[:,4*i:4*(i+1)],axis=1) for i in range(3)]).T
于 2013-10-21T21:38:08.237 回答