2016-10-21 23 views
-1

2と2の2つの行列AとBがあるとしましょう。水平に積み重ねてA [:、1]をB [ :、0]となるので、得られる行列Cは2×3であり、C[:,0] = A[:,0], C[:,1] = A[:,1] + B[:,0], C[:,2] = B[:,1]となる。さらに一歩進んで、対角に積み重ねてC[0:2,0:2] = A, C[1:2,1:2] = B, C[1,1] = A[1,1] + B[0,0]となるようにします。この場合、Cは3×3である。このルーチンをハードコーディングするのは難しいことではありませんが、私のメモリがうまく機能するならば、MATLABも同様の機能を持っているので興味があります。python numpyスタック行列

答えて

0

直接的アプローチがコピーまたは標的への2つのアレイを追加することである。

In [882]: A=np.arange(4).reshape(2,2) 
In [883]: C=np.zeros((2,3),int) 
In [884]: C[:,:-1]=A 
In [885]: C[:,1:]+=A # or B 
In [886]: C 
Out[886]: 
array([[0, 1, 1], 
     [2, 5, 3]]) 

別のアプローチは、端部にパッドAまでに開始時にパッドB、および合計です。便利なpad機能がありますが、それ以上の高速化はありません。

斜め

In [887]: C=np.zeros((3,3),int) 
In [888]: C[:-1,:-1]=A 
In [889]: C[1:,1:]+=A 
In [890]: C 
Out[890]: 
array([[0, 1, 0], 
     [2, 3, 1], 
     [0, 2, 3]]) 

再び2つの配列はpadことと添加可能性があります。

私はこれを行うための特別な機能に気づいていません。たとえあったとしても、おそらく同じことをするでしょう。これは、コンパイルされたバージョンを正当化するための一般的な操作ではありません。

ラッピング要素行列を加算することで、有限要素スパース行列を構築しました。 MATLABとscipyの両方のための疎フォーマットは、これを容易にします(重複座標は合計されます)。

============

In [896]: np.pad(A,[[0,0],[0,1]],mode='constant')+np.pad(A,[[0,0],[1,0]],mode=' 
    ...: constant') 
Out[896]: 
array([[0, 1, 1], 
     [2, 5, 3]]) 
In [897]: np.pad(A,[[0,1],[0,1]],mode='constant')+np.pad(A,[[1,0],[1,0]],mode=' 
    ...: constant') 
Out[897]: 
array([[0, 1, 0], 
     [2, 3, 1], 
     [0, 2, 3]]) 

これを行うための特別なMATLABコードは何ですか?

はオクターブに私が見つかりました:

prepad(A,3,0,axis=2)+postpad(A,3,0,axis=2) 
関連する問題