我想在 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 只需要更改数组的 shape
和 strides
属性,而不必复制任何实际数据。
编辑 为确保 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
一般来说,只有在您的数组上执行transpose
、rollaxis
、swapaxes
或类似操作时才会出现问题。
关于python - numpy 二维数组的 block 均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14229029/