2016-10-25 4 views
0

からマトリックスを展開します。あなたは、サイズの各部分行列D(2×2)のための行列の別のセットを作成する方法numpyの:効率的寸法の正方形アレイD(4×4)指定された部分行列

array([[ 1, 2, 5, 6], 
     [ 3, 4, 7, 8], 
     [ 9, 10, 13, 14], 
     [11, 12, 15, 16]]) 

D *、私はそのようなことを、*、D ** Dのうち、別の正方形アレイを構築したいな

D* = [..., 
     [[ 1, 2, 1, 2], 
      [ 3, 4, 3, 4], 
      [ 1, 2, 1, 2], 
      [ 3, 4, 3, 4]] 
    ] 

こと:

D** = [[ 1, 2, 1, 2, 5, 6, 5, 6], 
      [ 3, 4, 3, 4, 7, 8, 7, 8], 
      [ 1, 2, 1, 2, 5, 6, 5, 6], 
      [ 3, 4, 3, 4, 7, 8, 7, 8], 
      [ 9, 10, 9, 10, 13, 14, 13, 14], 
      [ 11, 12, 11, 12, 15, 16, 15, 16], 
      [ 9, 10, 9, 10, 13, 14, 13, 14], 
      [ 11, 12, 11, 12, 15, 16, 15, 16]]] 

私の実際のstarti行列Dの次元は184x184なので、forループはこれを達成するには遅すぎることがわかりました。これはnumpyにとって計算量が多すぎますか?それとも効率的にこれをエレガントに達成する方法はありますか?ここ

はfoorループの擬似コードの例である:

segments = [(0,0), (2,2), (0,2), (2, 0)] 
for seg in segments: 
    actual_seg = D[seg[0]:seg[0]+2, seg[1]:seg[1]+2] 
    D*.append(numpy.kron(numpy.ones((2, 2), dtype=int), actual_seg)) 
+0

この単純な例では、** D *とDにDをもたらす数学的機能を理解するのに十分ではありません。あなたはD *とD **をどのように作成するかを正式化できますか?たぶんあなたの4-forループコードを含めるかもしれない –

+0

だから、D *は "それぞれ*重複しない*サブマトリックス2を2でタイルしてリストを作る"ことを意味し、D **は "D *のこれらのマトリックスをすべて1つの大きなマトリックス"?これは、あなたの望むことですか? – Kh40tiK

答えて

0
from __future__ import print_function 
import numpy as np 

def fn(m_): 
     rows, cols = m_.shape 
     assert rows%2==0 and cols%2==0 
     return np.reshape(
      np.transpose(
       np.tile(
        np.transpose(
         np.reshape(
          m_,(rows//2,2, cols//2,2) 
         ),(0,2,1,3)),(2,2)), (0,2,1,3) 
      ), 
      (rows*2,cols*2) 
     ) 

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

print(fn(m)) 

出力:Dこのような各(2x2)サブ行列を用いて一つのアプローチを展開するために探して考える

[[ 1 2 1 2 5 6 5 6] 
[ 3 4 3 4 7 8 7 8] 
[ 1 2 1 2 5 6 5 6] 
[ 3 4 3 4 7 8 7 8] 
[ 9 10 9 10 13 14 13 14] 
[11 12 11 12 15 16 15 16] 
[ 9 10 9 10 13 14 13 14] 
[11 12 11 12 15 16 15 16]] 
2

np.tilenp.repeatの組み合わせは、 -

m,n = D.shape 
out = np.repeat(np.tile(D.reshape(m//2,2,n//2,2),2),2,axis=0).reshape(2*m,2*n) 

サンプル実行 -

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

In [117]: m,n = D.shape 

In [118]: np.repeat(np.tile(D.reshape(m//2,2,n//2,2),2),2,axis=0).reshape(2*m,2*n) 
Out[118]: 
array([[ 1, 2, 1, 2, 5, 6, 5, 6], 
     [ 3, 4, 3, 4, 7, 8, 7, 8], 
     [ 1, 2, 1, 2, 5, 6, 5, 6], 
     [ 3, 4, 3, 4, 7, 8, 7, 8], 
     [ 9, 10, 9, 10, 13, 14, 13, 14], 
     [11, 12, 11, 12, 15, 16, 15, 16], 
     [ 9, 10, 9, 10, 13, 14, 13, 14], 
     [11, 12, 11, 12, 15, 16, 15, 16]]) 
関連する問題