最有效的方法来颠倒numpy数组

信不信由你,在分析我现在的代码之后,numpy数组反转的重复操作吃了大量的运行时间。 我现在所拥有的是基于普遍观点的方法:

reversed_arr = arr[::-1] 

还有没有其他办法可以更有效地做到这一点,还是仅仅是因为我对不切实际的颠簸performance的痴迷而产生的幻想呢?

在创buildreversed_arr您正在创build视图到原始数组中。 然后,您可以更改原始数组,并更新视图以反映更改。

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

 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意见:

查看到一个numpy数组?

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

请注意,对于一维数组,您需要欺骗一下:

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

因为这似乎没有被标记为答案呢…托马斯·阿里尔森的答案应该是正确的:只是使用

 np.flipud(your_array) 

如果它是一个1d数组(列数组)。

随着matrizes做

 fliplr(matrix) 

如果你想扭转行和flipud(matrix)如果你想要翻转列。 不需要使你的1d列数组成为2维行数组(matrix有一个None层),然后翻转它。

如上所述, a[::-1]实际上只创build一个视图,所以它是一个常量操作(因为数组不会更长)。 如果你需要这个数组是连续的(例如,因为你正在执行许多向量操作), ascontiguousarrayflipup / 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(20)], xlabel='len(a)', logx=True, logy=True, ) 

我将在之前关于np.fliplr()回答中进行扩展。 下面是一些代码,演示如何构build1d数组,将其转换为2d数组,将其翻转,然后转换回1d数组。 time.clock()将用于保持时间,这是以秒为单位表示的。

 import time import numpy as np start = time.clock() x = np.array(range(3)) #transform to 2d x = np.atleast_2d(x) #flip array x = np.fliplr(x) #take first (and only) element x = x[0] #print x end = time.clock() print end-start 

打印语句未注释:

 [2 1 0] 0.00203907123594 

随着印刷声明评论:

 5.59799927506e-05 

所以,就效率而言,我认为这是体面的。 对于那些喜欢用一行来做的人来说,就是这样的forms。

 np.fliplr(np.atleast_2d(np.array(range(3))))[0] 

为了让它与负数和长列表一起工作,您可以执行以下操作:

 b = numpy.flipud(numpy.array(a.split(),float)) 

哪里flipd为1darrays