2016-06-28 11 views
1

numpyで配列を反転して回転させる方法はありますか?たとえば、時計回りに1回回転させてから反転させますか?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 

出力:Transposing a NumPy array

[[ 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] 

P.S:この質問はの重複ではありません。現在の質問は、「転置」機能の安定性に争うものではない。それは機能自体を求めています。

+2

'np.transpose()'、エイリアス 'ar.T'(Ipythonの私timeit時間ははるかに小さいあなたです)。 –

答えて

2

np.rot90のコードk=3のあなたのケースでは、ありません:

# 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つの機能の使用にもかかわらず、xviewのままで、arです。

2つの機能は必要ありませんが、それほど高価ではありません。私たちは、マイクロ秒〜ナノ秒の時間を話しています。

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 
+0

どのくらい速いかを実証していただきありがとうございます。 – cpicanco

1

フリップして一緒に回転すると(例に基づいて)matrix transposeです。行列の転置は、行列の次元の順列です。たとえば、最初の次元が2番目の次元になり、逆も同様です。アレイの寸法入れ替え

numpy.transpose(a, axes=None) 

numpy.transpose機能をサポートします。パラメータ

  • a : array_like:入力配列。
  • axes:intのリスト(オプション) デフォルトでは、次元を逆にします。それ以外の場合は、与えられた値に従って軸を並べ替えます。

戻り

  • p : ndarray:並べ替えその軸を持ちます。可能であれば、ビューが返されます。 transposeなり
1

>>> 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]]) 
関連する問題