反转numpy数组的最有效方法

2024-04-24 15:18:32 发布

您现在位置:Python中文网/ 问答频道 /正文

信不信由你,在分析了我当前的代码之后,numpy数组反转的重复操作消耗了大量的运行时间。我现在拥有的是基于视图的通用方法:

reversed_arr = arr[::-1]

有没有其他方法可以更有效地做到这一点,或者这仅仅是我对不切实际的裸体表演痴迷的幻觉?


Tags: 方法代码numpy视图时间数组arr裸体
3条回答

当您创建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)

我不是核弹专家,但这似乎是在核弹里做事情最快的方法。如果这是你已经在做的,我认为你不能改进它。

p.S.关于努比观点的精彩讨论:

View onto a numpy array?

np.fliplr()将数组从左向右翻转。

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

arr1d = np.array(some_sequence)
reversed_arr = np.fliplr([arr1d])[0]

如上所述,a[::-1]实际上只创建一个视图,因此它是一个恒定的时间操作(因此,随着数组的增长,不会花费更长的时间)。如果需要数组是连续的(例如,因为要对它执行许多向量操作),ascontiguousarray大约与flipup/fliplr一样快:

enter image description here


生成绘图的代码:

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,
)

相关问题 更多 >