[英]Flip and rotate numpy array
有沒有更快的方法來翻轉和旋轉numpy中的數組? 例如,順時針旋轉一次然后翻轉?
import numpy as np
a = np.arange(0,10)
b = np.arange(-11,-1)
ar = np.array([a,b])
print ar
print ar.shape
ar = np.rot90(ar, 3)
print np.fliplr(ar)
print ar.shape
輸出:
[[ 0 1 2 3 4 5 6 7 8 9]
[-11 -10 -9 -8 -7 -6 -5 -4 -3 -2]]
(2, 10)
[[ 0 -11]
[ 1 -10]
[ 2 -9]
[ 3 -8]
[ 4 -7]
[ 5 -6]
[ 6 -5]
[ 7 -4]
[ 8 -3]
[ 9 -2]]
(10, 2)
[Finished in 0.1s]
PS:此問題不是以下內容的重復: 轉置NumPy數組 。 當前的問題並不反對“移調”功能的穩定性; 它要求功能本身。
在k=3
情況下, np.rot90
的代碼可以:
# k == 3
return fliplr(m.swapaxes(0, 1))
所以
In [789]: np.fliplr(ar.swapaxes(0, 1))
Out[789]:
array([[-11, 0],
...
[ -3, 8],
[ -2, 9]])
所以你
fliplr(rot90(ar, 3))
變成
np.fliplf(np.fliplr(ar.swapaxes(0, 1)))
# the flips cancel
ar.swapaxes(0,1)
# but this is just
ar.T
因此,您的一對動作減少了轉置。
transpose
(和swap
)只是改變了.shape
和strides
陣列的屬性; 它是一個視圖,而不是副本。
np.fliplr
還會創建一個視圖,並通過[:,::-1]
改變步幅。
原始ar
:
In [818]: ar
Out[818]:
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[-11, -10, -9, -8, -7, -6, -5, -4, -3, -2]])
In [819]: x=np.fliplr(np.rot90(ar,3)) # your pair of actions
In [820]: x
Out[820]:
array([[ 0, -11],
[ 1, -10],
...
[ 8, -3],
[ 9, -2]])
In [821]: x[0,1]=11
In [822]: x
Out[822]:
array([[ 0, 11],
[ 1, -10],
...
[ 9, -2]])
In [823]: ar
Out[823]:
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[ 11, -10, -9, -8, -7, -6, -5, -4, -3, -2]])
更改x
的值將更改ar
的值。 盡管使用了2個函數,但x
仍然是ar
的view
。
這兩個函數不是必需的,但是它們也不是那么昂貴。 我們所說的是微秒v納秒的時間。 (我在Ipython中的timeit
時間要小得多)
In [824]: timeit np.fliplr(np.rot90(ar,3))
100000 loops, best of 3: 8.28 µs per loop
In [825]: timeit ar.T
1000000 loops, best of 3: 455 ns per loop
一起翻轉和旋轉(根據您的示例)是矩陣轉置 :矩陣轉置是矩陣尺寸的排列:例如,第一維變成第二維,反之亦然。
numpy支持numpy.transpose
函數:
numpy.transpose(a, axes=None)
排列數組的尺寸。
參數 :
a : array_like
:輸入數組。axes
:整數列表,可選,默認情況下,反轉尺寸,否則根據給定的值對坐標軸進行排列。返回值 :
p : ndarray
:一個軸被置換的a。 盡可能返回一個視圖。
那將被transpose
:
>>> import numpy as np
>>> a = np.arange(0,10)
>>> b = np.arange(-11,-1)
>>> ar = np.array([a,b])
>>> ar.T
array([[ 0, -11],
[ 1, -10],
[ 2, -9],
[ 3, -8],
[ 4, -7],
[ 5, -6],
[ 6, -5],
[ 7, -4],
[ 8, -3],
[ 9, -2]])
>>> np.transpose(ar)
array([[ 0, -11],
[ 1, -10],
[ 2, -9],
[ 3, -8],
[ 4, -7],
[ 5, -6],
[ 6, -5],
[ 7, -4],
[ 8, -3],
[ 9, -2]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.