如何根据索引创建变量矩阵

时间:2017-01-12 07:33:34

标签: numpy scipy

我正在尝试使用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是一系列对角矩阵,使得每个A_k在对角线的第k个位置具有1,并且1 <1。 k&lt; N和A_1是一个对角矩阵,在其他地方的(1,1)位置零点为0.5,A_N是一个对角矩阵,在(N,N)位置为0.5,其他地方为零。 / p>

我知道我可以使用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)

2 个答案:

答案 0 :(得分:1)

A_k = np.zeros((n,n))
A_k[k,k] =1
如果=.5k==0

,请

k==n-1

或者我错过了一些细微差别?

要使其稀疏,请使用正确大小的lil。虽然为单个对角线值指定coo输入也很容易。

答案 1 :(得分: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]]])