最有效的方法来颠倒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一个视图,所以它是一个常量操作(因为数组不会更长)。 如果你需要这个数组是连续的(例如,因为你正在执行许多向量操作), 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(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