簡體   English   中英

翻轉和旋轉numpy數組

[英]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 )只是改變了.shapestrides陣列的屬性; 它是一個視圖,而不是副本。

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仍然是arview

這兩個函數不是必需的,但是它們也不是那么昂貴。 我們所說的是微秒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.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM