信不信由你,在分析了我当前的代码后,numpy数组还原的重复操作消耗了大量的运行时间。我现在拥有的是常见的基于视图的方法:
reversed_arr = arr[::-1]
有没有其他更有效的方法,或者这只是我痴迷于不切实际的numpy性能的幻觉?
信不信由你,在分析了我当前的代码后,numpy数组还原的重复操作消耗了大量的运行时间。我现在拥有的是常见的基于视图的方法:
reversed_arr = arr[::-1]
有没有其他更有效的方法,或者这只是我痴迷于不切实际的numpy性能的幻觉?
当前回答
我将详述先前关于np.fliplr()的答案。下面是一些代码,演示了构造一个1d数组,将其转换为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
所以,就效率而言,我认为这是不错的。如果你们喜欢用一行来写,这就是表格。
np.fliplr(np.atleast_2d(np.array(range(3))))[0]
其他回答
因为这似乎还没有被标记为回答…托马斯·阿里尔森的回答应该是正确的:使用
np.flipud(your_array)
如果是一维数组(列数组)。
用矩阵做
fliplr(matrix)
如果你想反转行和翻转(矩阵)如果你想翻转列。不需要使你的一维列数组一个二维行数组(矩阵与一个None层),然后翻转它。
在别人说过的基础上,我举一个简短的例子。
如果你有一个一维数组……
>>> 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。翻转来翻转元素
>>> 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.fliplr()将数组从左向右翻转。
注意,对于1d数组,你需要一点技巧:
arr1d = np.array(some_sequence)
reversed_arr = np.fliplr([arr1d])[0]
我将详述先前关于np.fliplr()的答案。下面是一些代码,演示了构造一个1d数组,将其转换为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
所以,就效率而言,我认为这是不错的。如果你们喜欢用一行来写,这就是表格。
np.fliplr(np.atleast_2d(np.array(range(3))))[0]
a[::-1]
只创建一个视图,因此它是一个常量时间操作(因此随着数组的增长不会花费更长的时间)。如果你需要数组是连续的(例如,因为你要对它执行许多向量操作),ascontinuousarray大约和flipud/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)",
)