信不信由你,在分析我当前的代码之后,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观点的讨论非常好:
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)
小智 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维行数组(具有一个无图层的矩阵),然后将其翻转.