2017-01-12 10 views
1

scipy or numpyを使用して次のタイプの行列を作成しようとしています。インデックスに応じて可変行列を作成する方法

A_1 = diag(0.5, 0, 0, ...., 0) 
A_k = diag(0,0, ..., 1, 0, 0, ....,0) for each 1 < k < N 
A_N = diag(0, 0, ...., 0, 0.5) 

本質A_k Sは、各 K < NとA_1ための対角のk番目の位置に1(1 0.5を有する対角行列で有するような対角行列の系列であります1)0以外の位置に0を持ち、A_Nは、(N、N)の位置に0.5、それ以外のすべての0を持つ対角行列です。

私はscipyのスパース行列を使用できますが、私は個々の行列を作成する方法を知っています。しかし、kに応じて呼び出すことができる関数として、一連の行列全体をどのように作成するのですか?より明示的にNのため

= 4

A_1 = diag(0.5, 0, 0, 0) 
A_2 = diag(0, 1, 0, 0) 
A_3 = diag(0, 0, 1, 0) 
A_4 = diag(0, 0, 0, 0.5) 
+0

2D配列のそれぞれが 'A_1'などではありませんか?多分、N = 4か何かの期待されるo/pを見せてくれるでしょうか? – Divakar

+0

はい、そうです。行列を明示的に追加しました。 – minibuffer

答えて

1

ここでアプローチだ -

def diag_ndarray(N): 
    # Initialize o/p array 
    out = np.zeros((N,N,N)) 

    # Get n-dimensional indices for assigning non-zero values 
    idx = np.tile(np.arange(N),3).reshape(3,-1) 

    # Setup non-zero values and assign with subscripted indexing 
    out[tuple(idx)] = np.hstack((0.5,[1]*(N-2),0.5)) 
    return out 

簡単なバージョン -

def diag_ndarray_v2(N): 
    out = np.zeros((N,N,N)) 
    r = np.arange(N) 
    out[r,r,r] = np.hstack((0.5,[1]*(N-2),0.5)) 
    return out 

もう少し線形インデックスとの短いバージョン -

def diag_ndarray_v3(N): 
    out = np.zeros((N,N,N)) 
    out.ravel()[np.arange(N)*(1+N*(N+1))] = np.hstack((0.5,[1]*(N-2),0.5)) 
    return out 

サンプル実行 -

In [128]: diag_ndarray(N=4) 
Out[128]: 
array([[[ 0.5, 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. ]], 

     [[ 0. , 0. , 0. , 0. ], 
     [ 0. , 1. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. ]], 

     [[ 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 1. , 0. ], 
     [ 0. , 0. , 0. , 0. ]], 

     [[ 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0.5]]]) 
+0

疎らにするには、適切な大きさの '' lil''で始めてください。 – minibuffer

+0

@JackDawkinsここでは望ましい出力である3D配列をサポートしていないので、あなたは疎な行列で表現することはできません。 – Divakar

1
A_k = np.zeros((n,n)) 
A_k[k,k] =1 

または=.5k==0場合や

k==n-1または私はいくつかのニュアンスが欠落しているのですか?

これは、適切なサイズのlilで始まります。その単一の対角値に対してcoo入力を指定することも簡単ですが、

+0

これは、私が例えば右上で合計できる一連の行列を作成しません。 (つまり、sum(A_k)は私にA_1 + A_2 + A_3 +などを与えるでしょう) – minibuffer

関連する問題