[英]Most efficient way to reverse a numpy array
信不信由你,在分析了我当前的代码之后,numpy 数组反转的重复操作占用了运行时间的一大块。 我现在拥有的是常见的基于视图的方法:
reversed_arr = arr[::-1]
有没有其他方法可以更有效地做到这一点,或者这只是我对不切实际的 numpy 性能的痴迷的错觉?
创建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)
我不是 numpy 专家,但这似乎是 numpy 中最快的处理方式。 如果这是您已经在做的事情,我认为您无法改进。
PS 在这里对 numpy 意见的精彩讨论:
正如刚才提到的,
a[::-1]
实际上只创建一个视图,所以它是一个恒定时间的操作(因此随着数组的增长不需要更长的时间)。 如果您需要数组是连续的(例如,因为您正在使用它执行许多向量操作), ascontiguousarray
与flipud
/ fliplr
一样快:
生成 plot 的代码:
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)",
)
因为这似乎还没有被标记为已回答...... Thomas Arildsen 的回答应该是正确的:只需使用
np.flipud(your_array)
如果它是一维数组(列数组)。
随着矩阵做
fliplr(matrix)
如果你想反转行和flipud(matrix)
如果你想翻转列。 无需将一维列数组设为二维行数组(具有一个 None 层的矩阵)然后翻转它。
np.fliplr()
从左到右翻转数组。
请注意,对于 1d arrays,您需要花点功夫:
arr1d = np.array(some_sequence)
reversed_arr = np.fliplr([arr1d])[0]
我将扩展关于np.fliplr()
的早期答案。 这是一些代码,演示了构造一维数组,将其转换为二维数组,翻转它,然后转换回一维数组。 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
使用 print 语句注释掉:
5.59799927506e-05
所以,就效率而言,我认为这是体面的。 对于那些喜欢在一行中完成的人,这里是那种形式。
np.fliplr(np.atleast_2d(np.array(range(3))))[0]
扩展其他人所说的内容,我将举一个简短的例子。
如果你有一个一维数组......
>>> import numpy as np
>>> x = np.arange(4) # array([0, 1, 2, 3])
>>> x[::-1] # returns a view
Out[1]:
array([3, 2, 1, 0])
但是,如果您正在使用 2D 数组...
>>> x = np.arange(10).reshape(2, 5)
>>> x
Out[2]:
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>> x[::-1] # returns a view:
Out[3]: array([[5, 6, 7, 8, 9],
[0, 1, 2, 3, 4]])
这实际上并没有反转矩阵。
应该使用 np.flip 来实际反转元素
>>> np.flip(x)
Out[4]: array([[9, 8, 7, 6, 5],
[4, 3, 2, 1, 0]])
如果要逐个打印矩阵的元素,请使用 flat 和 Flip
>>> for el in np.flip(x).flat:
>>> print(el, end = ' ')
9 8 7 6 5 4 3 2 1 0
基于切片符号的类似 np.flip 将是 [::-1,::-1]
a = np.array([[1., 2.], [3., 4.], [5, 6]])
print(a)
out: [[1. 2.]
[3. 4.]
[5. 6.]]
b=a[::-1,::-1]
print(b)
out: [[1. 2.]
[3. 4.]
[5. 6.]]
为了让它使用负数和长列表,您可以执行以下操作:
b = numpy.flipud(numpy.array(a.split(),float))
Flipud 用于 1d arra 的位置
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.