反转numpy数组的最有效方法

新手上路,请多包涵

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

 reversed_arr = arr[::-1]

有没有其他方法可以更有效地做到这一点,或者这只是我痴迷于不切实际的 numpy 性能的一种错觉?

原文由 nye17 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 686
2 个回答
reversed_arr = arr[::-1]

给出原始数组的反向 视图 arr 。对原始数组 arr 所做的任何更改也将在 reversed_arr 中立即可见。 arrreversed_arr 的底层数据缓冲区是 共享 的,因此创建此视图始终是即时的,并且不需要任何额外的内存分配或复制数组内容。

另请参阅有关 NumPy 视图的讨论: 如何在 NumPy 数组上创建视图?


视图性能问题的可能解决方案

您重新创建视图的频率是否超出了您的需要?你应该能够做这样的事情:

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

do_something(arr)
look_at(reversed_arr)
do_something_else(arr)
look_at(reversed_arr)

我不是 numpy 专家,但这似乎是在 numpy 中做事的最快方法。如果这是您已经在做的事情,我认为您无法改进。

原文由 steveha 发布,翻译遵循 CC BY-SA 4.0 许可协议

a[::-1]

只创建一个视图,所以它是一个恒定时间的操作(因此不会随着数组的增长而花费更长的时间)。如果你需要数组是连续的(例如,因为你正在用它执行许多向量操作), ascontiguousarray 大约和 flipud / fliplr -ecd-7一样快:

在此处输入图像描述


生成图的代码:

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

原文由 Nico Schlömer 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏