【问题标题】:How to reverse a numpy array of unknown dimension?如何反转未知维度的numpy数组?
【发布时间】:2020-06-19 05:16:05
【问题描述】:

我只是在学习 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 查看文档,切片看起来像是在单维数组上运行。这是否适用于多维数组,因为最终多维数组存储为一维列表,并且反转该列表的顺序相当于反转多维数组的每个维度?另外,切片是否像翻转一样以恒定时间运行?
  • 查看np.flip 代码。它构造了一个indexer 元组,它是np.s_[:]np.s_[::-1] 的混合体(取决于尺寸参数)。这就是我的建议。

标签: python arrays numpy scipy convolution


【解决方案1】:

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

numpy.flip(m, axis=None)

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

数组的形状被保留,但元素被重新排序。

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

【讨论】:

    【解决方案2】:

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

    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]
    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 2017-10-31
    • 1970-01-01
    • 2013-11-07
    • 2012-05-14
    • 2020-06-09
    • 2023-03-15
    • 2013-07-20
    相关资源
    最近更新 更多