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

4

我正在学习Python,但决定通过重新编写和改进一些旧的基于Java的校园AI项目来进行。

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

因此,虽然在我的原始Java项目中我只是写了所有代码来执行操作,但由于我现在使用的是Python,并且它有很棒的数学库,如numpy和scipy,所以我想我可以利用现有的卷积函数,如scipy.convolve。 然而,这需要我先对两个数组之一进行反向处理,以便当scipy.convolve运行并反转其中一个数组以执行卷积时,它实际上是将该数组还原回去。(我还不知道如何确保正确地预先翻转两个数组之一,使得这两个数组在正向滑动而不是反向滑动,但我认为我应该把这个问题单独问一下。)

与我的Java代码不同,它仅处理一维数据,我希望将这个项目扩展到多维数据。因此,虽然我已经学会了如果我有一个已知维度的numpy数组,例如三维数组a,我可以完全反转数组(或者说获取一个反向的视图,这样速度更快),方法是:

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

然而,这需要我对每个维度都有一个::-1。我该如何在一个具有任意维度的数组的方法内执行相同的反转,并产生与上述代码相同的结果?

slice(None,None,-1) 是相同的东西。尝试使用包含多个元素的元组进行索引。 - hpaulj
@hpaulj 从文档上看,切片似乎只适用于单维数组。但是,它是否适用于多维数组,因为最终多维数组存储为单维列表,并且反转该列表的顺序等效于反转多维数组的每个维度?此外,切片是否像翻转一样在常数时间内运行? - Shufflepants
看看 np.flip 代码。它构造了一个 indexer 元组,其中混合了 np.s_[:]np.s_[::-1](取决于维度参数)。这就是我所建议的。 - hpaulj
2个回答

4
你可以使用np.flip方法。从文档中可知:

numpy.flip(m, axis=None)

沿给定轴翻转数组元素的顺序。

数组的形状保持不变,但元素的顺序被重新排序。

注意: flip(m) 等价于在所有位置上使用 ::-1m[::-1,::-1,...,::-1]


0
这是一个可能的解决方案:
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]])

尝试使用slice(None,None,-1)np.s_[::-1] - hpaulj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接