Python numpy二维阵列的块平均值

Python numpy二维阵列的块平均值,python,numpy,matrix,reshape,mean,Python,Numpy,Matrix,Reshape,Mean,我想在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]]) 我想将这个数组分成3个大小为2x4的块,然后找到所有三个块的平均值(因此平均值的形状为2x4)。第一个块由前4列组成,下一个块由后4列组成,依此类推。因此我的块是: array([[0, 1

我想在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]])
我想将这个数组分成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数组,然后沿第三个轴对3D数组使用
平均
方法。这可能类似于

如果有人能为我提供:

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

2) 。如果不是,则使用适当的Pythonic命令进行2D到3D转换


3) 。了解使用循环还是使用上面的命令更有效(就空间而言)。

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.]])
诀窍在于
重塑
。对于需要
n
列块的一般情况,以下是一个选项

a = a.reshape((a.shape[0], -1, n))
你在第三章中的担忧大多是没有根据的。返回原始数组的视图,而不是副本,因此转换为3D只需要更改数组的
形状
步长
属性,而不必复制任何实际数据

编辑 要确保重塑不会复制阵列,而是返回一个视图,请按以下步骤进行重塑

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
a=np.arange(12)。重塑(3,4) >>>b=a.T >>>b.形状=(12,) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 AttributeError:非连续数组的不兼容形状 一般来说,只有在阵列上执行了
转置
滚动轴
交换盘
或类似操作时才会出现问题。

我可以回答您的数字1)


你链接的问题,或者实际上是答案,是我见过的最酷的numpy代码之一。谢谢!这太酷了!我提到第(3)点的原因是因为提到返回可能是一个副本,而不是一个视图。
vstack([mean(a[:,4*i:4*(i+1)],axis=1) for i in range(3)]).T