2016-09-11 14 views
1

Numpy ravelは、行や列で読んでベクトルを作成する必要がある場合にうまく機能します。しかし、画像処理でよく使われる方法を使って、行列を1次元配列に変換したいと考えています。これは、初期行列Aと、最終的な結果Bと例です。Pythonを使ったMatrix to numpy

A = np.array([[ 0, 1, 2, 3], 
       [ 4, 5, 6, 7], 
       [ 8, 9, 10, 11], 
       [12, 13, 14, 15]]) 

B = np.array([[ 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15]) 

既存の機能はそれに私を助けることができることをすでにそこにいますか?そうでない場合は、この問題の解決方法に関するヒントを教えてください。 PS。行列ANxNです。

+0

これはジグザグの対角線ですか?その技術的な名前はありますか?目的は何ですか? – hpaulj

答えて

4

私は数年前からnumpyを使用していましたが、このような機能は見たことがありません。

In [47]: a 
Out[47]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]]) 

In [48]: np.concatenate([np.diagonal(a[::-1,:], k)[::(2*(k % 2)-1)] for k in range(1-a.shape[0], a.shape[0])]) 
Out[48]: array([ 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15]) 

別々の段階へのワンライナー内訳:

は、ここでは、(必ずしも最も効率的に)それを行うことができ一つの方法だ

In [59]: a[::-1, :] 
Out[59]: 
array([[12, 13, 14, 15], 
     [ 8, 9, 10, 11], 
     [ 4, 5, 6, 7], 
     [ 0, 1, 2, 3]]) 

a[::-1, :]は、行を反転させます

(これはa[::-1]またはnp.flipud(a)と書くこともできます)

np.diagonal(a, k)は、k番目の対角を抽出します。k=0が主対角です。だから、リスト内包で例えば、

In [65]: np.diagonal(a[::-1, :], -3) 
Out[65]: array([0]) 

In [66]: np.diagonal(a[::-1, :], -2) 
Out[66]: array([4, 1]) 

In [67]: np.diagonal(a[::-1, :], 0) 
Out[67]: array([12, 9, 6, 3]) 

In [68]: np.diagonal(a[::-1, :], 2) 
Out[68]: array([14, 11]) 

kが抽出されるように対角線を与えます。他のすべての対角線の要素を逆にしたい。式2*(k % 2) - 1は、kが-3から3まで変化するため、値1、-1、1、...を返します。[::1]でインデックスを付けると、配列の順序は変更されず、インデックスは[::-1]で配列の順序が逆になります。だから、np.diagonal(a[::-1, :], k)[::(2*(k % 2)-1)]が与える対角線番目が、他のすべての対角線逆転とk

In [71]: [np.diagonal(a[::-1,:], k)[::(2*(k % 2)-1)] for k in range(1-a.shape[0], a.shape[0])] 
Out[71]: 
[array([0]), 
array([1, 4]), 
array([8, 5, 2]), 
array([ 3, 6, 9, 12]), 
array([13, 10, 7]), 
array([11, 14]), 
array([15])] 

np.concatenate()は、単一の配列にそれらすべてを置く:

In [72]: np.concatenate([np.diagonal(a[::-1,:], k)[::(2*(k % 2)-1)] for k in range(1-a.shape[0], a.shape[0])]) 
Out[72]: array([ 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15]) 
1

私はMATLABのためのジグザグスキャンの議論を見つけましたが、あまりありませんnumpyの場合一つのプロジェクトは、8×8ブロック

ZIG = np.array([[0, 1, 5, 6, 14, 15, 27, 28], 
       [2, 4, 7, 13, 16, 26, 29, 42], 
       [3, 8, 12, 17, 25, 30, 41, 43], 
       [9, 11, 18, 24, 31, 40, 44,53], 
       [10, 19, 23, 32, 39, 45, 52,54], 
       [20, 22, 33, 38, 46, 51, 55,60], 
       [21, 34, 37, 47, 50, 56, 59,61], 
       [35, 36, 48, 49, 57, 58, 62,63]]) 

どうやらそれが使われているJPEGやMPEG圧縮

https://github.com/lot9s/lfv-compression/blob/master/scripts/our_mpeg/zigzag.py

ためにハードコードされたインデックスの配列を使用して表示されます。

関連する問題