【问题标题】:Numpy: function that creates block matricesNumpy:创建块矩阵的函数
【发布时间】:2018-06-12 17:48:58
【问题描述】:

假设我有一个维度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,并吐出我需要的矩阵。

例如

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 似乎在正确的轨道上......

【问题讨论】:

  • np.identity(k*k)[:-k]?
  • I 不是一个,它们是 k 维单位矩阵
  • k是数组的形状还是它的维数???
  • 恒等矩阵的形状为 (k,k)
  • 是的,我明白这一点,但它们排列成一条长对角线。

标签: python python-3.x numpy matrix


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果我理解正确,这应该可以:

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

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

    【讨论】:

      【解决方案3】:

      IIUC,你也可以试试np.fill_diagonal,这样你就可以创建正确的矩阵形状,然后填充对角线部分。

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

      【讨论】:

      • 结果应该是((k-1)*k, k*k) 的形状(这就是你用@PaulPanzer 的np.identity(k*k)[:-k] 实现的),而不是(k*k, (k+1)*k)np.fill_diagonal(np.zeros(((k-1)*k, k*k)), 1) 似乎比较短的解决方案要快一些。
      【解决方案4】:

      您的问题有两种解释。一个是您基本上创建一个 [[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 是向量,现在通常被认为是表示单个矩阵,为简单起见,仅存在块符号。希望这会有所帮助!

      【讨论】:

      • 也许我不清楚我的问题中的 0 是零的 k 维方阵。单位矩阵具有相同的维度,所以我看不出我对块矩阵表示法感到困惑。 Paul Panzer 的评论是正确的,并且与我在示例中所写的内容相对应。 [[1, 0, 0], [0, 1, 0]] 如果您像我一样定义 I 和 0,则无法在数学上表示为 [I,0]
      • 保罗的回答和我给出的第一个选项是相同的。它可以以这种方式在数学上表示,坦率地说,它是应用线性代数中的一种常见形式,只是为了简化符号,所以我只是仔细检查了你的要求。保罗解释说,它们基本上和我一样,尽管你似乎反对它。以防万一我给了你 CS 指针选项,即在数组中包含数组
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      • 2017-04-12
      • 2022-11-02
      • 1970-01-01
      相关资源
      最近更新 更多