Numpy:创建块矩阵的函数

时间:2018-06-12 17:48:58

标签: python python-3.x numpy matrix

说我有一个维度k。我正在寻找的是一个以k作为输入并返回以下块矩阵的函数。

I为k维单位矩阵,0为零维k维方阵

那是:

def function(k):
...
return matrix 

function(2) -> np.array([I, 0])

function(3) -> np.array([[I,0,0]
                         [0,I,0]])

function(4) -> np.array([[I,0,0,0]
                         [0,I,0,0],
                         [0,0,I,0]])

function(5) -> np.array([[I,0,0,0,0]
                         [0,I,0,0,0],
                         [0,0,I,0,0],
                         [0,0,0,I,0]])

也就是说,输出是一个(k-1,k)矩阵,其中单位矩阵在对角元素上,零矩阵在其他地方。

我尝试了什么:

我知道如何创建任何单独的行,我只是想不出将其放入函数的方法,以便它需要一个维度k,并吐出我需要的矩阵。

e.g。

np.block([[np.eye(3),np.zeros((3, 3)),np.zeros((3, 3))],
          [np.zeros((3, 3)),np.eye(3),np.zeros((3, 3))]])

是k = 3

的理想输出

scipy.linalg.block_diag似乎可能在正确的轨道上......

4 个答案:

答案 0 :(得分:3)

IMO,np.eye已经拥有了您需要的一切,因为您可以分别定义行数和列数 所以你的功能应该简单地看起来像

def fct(k):
    return np.eye(k**2-k, k**2)

答案 1 :(得分:1)

如果我理解正确,这应该有效:

a = np.concatenate((np.eye((k-1)*k),np.zeros([(k-1)*k,k])), axis=1)

(至少,当我设置k=3并与您提供的np.block(...)表达式进行比较时,两个结果都相同)

答案 2 :(得分:0)

IIUC,您也可以尝试np.fill_diagonal,以便创建正确的矩阵形状,然后填写对角线部分。

def make_block(k):
    arr = np.zeros(((k-1)*k, k*k))
    np.fill_diagonal(arr, 1)
    return arr

答案 3 :(得分:-1)

您的问题有两种解释。一个是你基本上创建一个[[1,0,0],[0,1,0]]形式的矩阵,它可以在数学上表示为[I 0],另一个在每个元素包含它自己的numpy数组完全(这确实会降低计算能力但可能是你想要的)。

前者: np.append(np.eye(k-1), np,zeros((k-1, 1)), axis=1)

后者(有点复杂):

I = np.eye(m) #Whatever dimensions you want, although probably m==n
Z = np.eye(n) 
arr = np.zeros((k-1, k)
for i in range(k-1):
    for j in range(k):
        if i == j:
            arr[i,j] = np.array(I)
        else:
            arr[i,j] = np.array(Z)

我真的不知道第二个是如何有用的,所以我认为你可能会对块矩阵的基本结构感到困惑,如果这是你想要的那样。通常[A b],例如,A是矩阵而b是矢量,通常被认为现在表示单个矩阵,为简单起见,仅存在块符号。希望这有帮助!