首页 > 解决方案 > 有效地将 3d 数组中的值连接到 2d 数组

问题描述

我有一个 3 维数组A,我想对其中一个轴的值​​求和并创建一个包含总和的 2d 数组。

这可以通过使用循环遍历 3d 数组来天真地完成,但这样做非常慢。

A = np.sum(A,axis=0)可以比天真的方式更快地实现这一点,但是有更快的方法吗?

我在 Matlab 中找到了这个答案:https ://www.mathworks.com/matlabcentral/answers/3643-efficiently-converting-a-3d-matrix-to-a-2d-matrix

我想知道在 Python 中是否有类似的有效方法可以做到这一点。

以下是我正在寻找的内容:

A = np.ones((3, 3, 3))

# numpy magic ...

print (A)

/**********
* [3, 3, 3],
* [3, 3, 3],
* [3, 3, 3]
***********/

标签: pythonarraysnumpynumpy-ndarray

解决方案


我认为你最好的选择是使用方法ndarray.sum而不是np.sum. 内部处理将是相同的,但是当您使用该方法时,您不需要检查传入的对象是否已经是一个数组并可能转换它。话虽如此,开销的差异非常小。

内部循环已经用 C 语言编写并尽可能优化。我能想到的唯一额外改进是沿连续轴求和总是最快的。您可以通过使用类似的东西来确保这一点np.moveaxiscopy以保证连续性:

def fastsum(x, axis):
    if x.strides[axis] != x.itemsize:
        x = np.moveaxis(x, axis, -1).copy(order="C")
        axis = -1
    return x.sum(axis)

这个功能不是很有效。对于小型数组,任何收益都可能被 python 和 numpy 对象协议的开销所淹没。最好的办法是确保以正确的顺序生成数组,并仅x.sum(-1)在 C 连续数组或x.sum(0)Fortran 连续数组上使用。


推荐阅读