2024-04-24 15:18:32 发布
网友
信不信由你,在分析了我当前的代码之后,numpy数组反转的重复操作消耗了大量的运行时间。我现在拥有的是基于视图的通用方法:
reversed_arr = arr[::-1]
有没有其他方法可以更有效地做到这一点,或者这仅仅是我对不切实际的裸体表演痴迷的幻觉?
当您创建reversed_arr时,您正在将视图创建到原始数组中。然后可以更改原始数组,视图将更新以反映更改。
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()将数组从左向右翻转。
np.fliplr()
注意,对于1d数组,您需要稍微欺骗一下它:
arr1d = np.array(some_sequence) reversed_arr = np.fliplr([arr1d])[0]
如上所述,a[::-1]实际上只创建一个视图,因此它是一个恒定的时间操作(因此,随着数组的增长,不会花费更长的时间)。如果需要数组是连续的(例如,因为要对它执行许多向量操作),ascontiguousarray大约与flipup/fliplr一样快:
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, )
当您创建
reversed_arr
时,您正在将视图创建到原始数组中。然后可以更改原始数组,视图将更新以反映更改。您创建视图的频率是否超过了需要的频率?你应该可以这样做:
我不是核弹专家,但这似乎是在核弹里做事情最快的方法。如果这是你已经在做的,我认为你不能改进它。
p.S.关于努比观点的精彩讨论:
View onto a numpy array?
np.fliplr()
将数组从左向右翻转。注意,对于1d数组,您需要稍微欺骗一下它:
如上所述,
a[::-1]
实际上只创建一个视图,因此它是一个恒定的时间操作(因此,随着数组的增长,不会花费更长的时间)。如果需要数组是连续的(例如,因为要对它执行许多向量操作),ascontiguousarray
大约与flipup
/fliplr
一样快:生成绘图的代码:
相关问题 更多 >
编程相关推荐