最有效的方法来反转numpy数组

nye*_*e17 253 python numpy

信不信由你,在分析我当前的代码之后,numpy数组reversion的重复操作占用了运行时间的一大块.我现在拥有的是基于视图的常见方法:

reversed_arr = arr[::-1]
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以更有效地做到这一点,还是仅仅因为我对不切实际的numpy表现的痴迷而产生的错觉?

ste*_*eha 218

创建时,reversed_arr您正在创建原始数组的视图.然后,您可以更改原始数组,并且视图将更新以反映更改.

您是否更频繁地重新创建视图?你应该可以做这样的事情:

arr = np.array(some_sequence)
reversed_arr = arr[::-1]

do_something(arr)
look_at(reversed_arr)
do_something_else(arr)
look_at(reversed_arr)
Run Code Online (Sandbox Code Playgroud)

我不是一个笨拙的专家,但这似乎是在numpy中做事的最快方法.如果这是你已经在做的事情,我认为你不能改进它.

PS这里对numpy观点的讨论非常好:

查看numpy阵列?


Nic*_*mer 50

如上所述,a[::-1]实际上只创建一个视图,因此它是一个恒定时间操作(因此不会随着数组的增长而花费更长的时间).如果你需要数组是连续的(例如因为你用它执行了很多向量运算),ascontiguousarray那么和flipup/ 一样快fliplr:

在此输入图像描述


生成图的代码:

import numpy
import perfplot


perfplot.show(
    setup=lambda n: numpy.random.randint(0, 1000, n),
    kernels=[
        lambda a: a[::-1],
        lambda a: numpy.ascontiguousarray(a[::-1]),
        lambda a: numpy.fliplr([a])[0],
    ],
    labels=["a[::-1]", "ascontiguousarray(a[::-1])", "fliplr"],
    n_range=[2 ** k for k in range(25)],
    xlabel="len(a)",
    logx=True,
    logy=True,
)
Run Code Online (Sandbox Code Playgroud)


too*_*y44 37

np.fliplr() 从左到右翻转阵列.

请注意,对于1d数组,您需要稍微欺骗它:

arr1d = np.array(some_sequence)
reversed_arr = np.fliplr([arr1d])[0]
Run Code Online (Sandbox Code Playgroud)

  • `reversed_arr = np.flipud(arr1d)`似乎直接起作用. (31认同)
  • 一维数组被视为一列,而不是一行,因此要使用 [np.flipud](https://numpy.org/doc/stable/reference/ generated/numpy.flipud.html) (up-down) ,而不是 [fliplr](https://numpy.org/doc/stable/reference/ generated/numpy.fliplr.html#numpy.fliplr) (从左到右)。 (2认同)

小智 37

因为这似乎没有被标记为已回答...... Thomas Arildsen的答案应该是正确的:只需使用

np.flipud(your_array) 
Run Code Online (Sandbox Code Playgroud)

如果它是1d数组(列数组).

用matrizes做

fliplr(matrix)
Run Code Online (Sandbox Code Playgroud)

如果你想反转行,flipud(matrix)如果你想翻转列.无需使您的1d列数组成为2维行数组(具有一个无图层的矩阵),然后将其翻转.