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

reversed_arr = arr[::-1]

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


当前回答

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

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的模拟。翻转是[::-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.]]
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)",
)

为了让它处理负数和一个很长的列表,你可以做以下事情:

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

1d arra的flipud在哪里

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

np.flipud(your_array) 

如果是一维数组(列数组)。

用矩阵做

fliplr(matrix)

如果你想反转行和翻转(矩阵)如果你想翻转列。不需要使你的一维列数组一个二维行数组(矩阵与一个None层),然后翻转它。