信不信由你,在分析了我当前的代码后,numpy数组还原的重复操作消耗了大量的运行时间。我现在拥有的是常见的基于视图的方法:
reversed_arr = arr[::-1]
有没有其他更有效的方法,或者这只是我痴迷于不切实际的numpy性能的幻觉?
信不信由你,在分析了我当前的代码后,numpy数组还原的重复操作消耗了大量的运行时间。我现在拥有的是常见的基于视图的方法:
reversed_arr = arr[::-1]
有没有其他更有效的方法,或者这只是我痴迷于不切实际的numpy性能的幻觉?
当前回答
在别人说过的基础上,我举一个简短的例子。
如果你有一个一维数组……
>>> 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
其他回答
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做事情的最快方法。如果这是你已经在做的事情,我认为你无法改进。
为了让它处理负数和一个很长的列表,你可以做以下事情:
b = numpy.flipud(numpy.array(a.split(),float))
1d arra的flipud在哪里
在别人说过的基础上,我举一个简短的例子。
如果你有一个一维数组……
>>> 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.]]
因为这似乎还没有被标记为回答…托马斯·阿里尔森的回答应该是正确的:使用
np.flipud(your_array)
如果是一维数组(列数组)。
用矩阵做
fliplr(matrix)
如果你想反转行和翻转(矩阵)如果你想翻转列。不需要使你的一维列数组一个二维行数组(矩阵与一个None层),然后翻转它。