如何反转未知维度的 numpy 数组?

How to reverse a numpy array of unknown dimension?

我只是在学习 python,但我决定通过重新编码和改进一些基于 java 的旧学校 AI 项目来学习。

我的项目涉及一个数学运算,它基本上是一个离散的卷积运算,但没有一个时间反转的函数。

因此,在我最初的 java 项目中,我只是自己编写了所有代码来完成操作,因为我在 python 中工作,并且它有很棒的数学库,如 numpy 和scipy,我认为我可以利用现有的卷积函数,如 scipy.convolve。但是,这需要我预先反转两个数组之一,以便在运行 scipy.convolve 并反转其中一个数组以执行卷积时,它实际上是取消反转数组。 (我也仍然不知道如何确保预先反转两个数组中的正确一个,以便两个数组仍然向前滑动而不是向后滑动,但我想我应该问一个单独的问题。)

与我的 java 代码只处理一维数据不同,我想将这个项目扩展到多维数据。因此,虽然我了解到如果我有一个已知维度的 numpy 数组,例如三维数组 a,我可以完全反转该数组(或者更确切地说,取回一个反转的视图,这要快得多),通过

a = a(::-1, ::-1, ::-1)

但是,这需要我对每个维度都有一个 ::-1。对于与上述代码具有相同结果的任意维度数组,我如何在方法中执行相同的反转?

您可以使用 np.flip。来自文档:

numpy.flip(m, axis=None)

Reverse the order of elements in an array along the given axis.

The shape of the array is preserved, but the elements are reordered.

注意:flip(m) 对应于 m[::-1,::-1,...,::-1]::-1 在所有位置。

这是一个可能的解决方案:

slices = tuple([slice(-1, -n-1, -1) for n in a.shape])
result = a[slices]

扩展到任意数量的轴。验证:

a = np.arange(8).reshape(2, 4)
slices = tuple([slice(-1, -n-1, -1) for n in a.shape])
result = a[slices]

产量:

>>> a
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
>>> result
array([[7, 6, 5, 4],
       [3, 2, 1, 0]])