信不信由你,在分析了我当前的代码后,numpy数组还原的重复操作消耗了大量的运行时间。我现在拥有的是常见的基于视图的方法:

reversed_arr = arr[::-1]

有没有其他更有效的方法,或者这只是我痴迷于不切实际的numpy性能的幻觉?


当前回答

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

注意,对于1d数组,你需要一点技巧:

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

其他回答

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

注意,对于1d数组,你需要一点技巧:

arr1d = np.array(some_sequence)
reversed_arr = np.fliplr([arr1d])[0]
reversed_arr = arr[::-1]

给出原始数组arr的反向视图。对原始数组arr所做的任何更改也将立即在reversed_arr中可见。arr和reversed_arr的底层数据缓冲区是共享的,因此创建这个视图总是即时的,不需要为数组内容分配任何额外的内存或复制。

另请参阅关于NumPy视图的讨论:如何在NumPy数组上创建视图?


关于视图的性能问题的可能解决方案

您是否比实际需要更频繁地重新创建视图?你应该可以这样做:

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做事情的最快方法。如果这是你已经在做的事情,我认为你无法改进。

我将详述先前关于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的模拟。翻转是[::-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))

1d arra的flipud在哪里