python - numpy 二维数组的 block 均值

标签 python numpy matrix reshape mean

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

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 的 block ,然后求所有三个 block 的平均值(这样平均值的形状就是 2x4。第一个 block 由前 4 列组成,下一个接下来的 4 列等等。所以我的 block 是:

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

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

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

1).一个适当的 Pythonic 命令来执行 block 均值,甚至不转换为 3D,如果存在这样的技巧。

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

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

诀窍在于reshape。对于您想要 n 列 block 的一般情况,以下是一个选项

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

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

编辑 为确保 reshape 不复制数组,而是返回一个 View ,请按照以下方式 reshape

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

docs 中的示例遵循以下原则:

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

一般来说,只有在您的数组上执行transposerollaxisswapaxes 或类似操作时才会出现问题。

关于python - numpy 二维数组的 block 均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14229029/

相关文章:

python - 奇怪的错误 : AssertionError: Request global variable is not set

Python:Ctypes如何检查内存管理

c - 从不兼容的指针类型传递参数 1 of 'printf'

python - 如何打印一个单词,但在每一个新行之后都会添加一个字母

python - 在python中的二维数组上生成随机线

python - 如何以 python 方式获取 numpy argwhere 函数的最大值

python - 如何在由一列定义的分区内进行排序,但将分区保留在原处?

python - 列表在ndarray中的出现

R:将数组转换为一行矩阵

matlab - 如何编码这个矩阵乘法?