【问题标题】:Python: How to insert block matrixes along diagonal of larger matrixPython:如何沿较大矩阵的对角线插入块矩阵
【发布时间】:2017-09-30 09:48:14
【问题描述】:

我生成了一个随机对称的 100 x 100 矩阵。我还生成了一些随机的 10 x 10 对称矩阵。现在我想沿着 100 x 100 的对角线插入这 10 个块。我该怎么做呢?

我想过获取对角线索引,然后插入为

B[diag1, diag2] = A

但我似乎无法将对角线索引插入代码中。

【问题讨论】:

  • 你在用 Numpy 做这个吗?如果是这样,您应该将numpy 标签添加到您的问题中。您还应该添加一个minimal reproducible example 来说明您尝试过的内容,并清楚地解释它有什么问题。
  • 你的矩阵是什么?一个数组数组,还是一个numpy 实例?还是别的什么?
  • 在 numpy 中,您可以通过 B[i:i+10, i:i+10] 访问块(这是一个 10x10 矩阵,您可以为其分配 A)

标签: python matrix diagonal


【解决方案1】:

如果您使用numpy,这可能会有所帮助(适用于对称矩阵和非对称矩阵):

import numpy as np

# Your initial 100 x 100 matrix 
a = np.zeros((100, 100))


for i in range(10):
  # the 10 x 10 generated matrix with "random" number
  # I'm creating it with ones for checking if the code works 
  b = np.ones((10, 10)) * (i + 1)
  # The random version would be:
  #  b = np.random.rand(10, 10)
  # Diagonal insertion
  a[i*10:(i+1)*10,i*10:(i+1)*10] = b

【讨论】:

    【解决方案2】:

    如果您使用的是 numpy,那么我们可以编写为另一种可用的解决方案

    import numpy as np
    
    x1 = np.eye(10)
    A = np.block([
        [x1,np.random.rand(10,90)],
        [np.random.rand(10,10),x1,np.random.rand(10,80)],
        [np.random.rand(10,20),x1,np.random.rand(10,70)],
        [np.random.rand(10,30),x1,np.random.rand(10,60)],
        [np.random.rand(10,40),x1,np.random.rand(10,50)],
        [np.random.rand(10,50),x1,np.random.rand(10,40)],
        [np.random.rand(10,60),x1,np.random.rand(10,30)],
        [np.random.rand(10,70),x1,np.random.rand(10,20)],
        [np.random.rand(10,80),x1,np.random.rand(10,10)],
        [np.random.rand(10,90),x1],
        ])
    print (A)
    

    x1 是你的小矩阵,它可以是任何分布,我只使用单位矩阵进行测试。

    【讨论】:

      【解决方案3】:

      以矢量化方式执行此操作是理想的 - 从理论上讲,看起来像这样:

      In [50]: a = np.ones((100,100)); b = np.ones((10,10))*2;
      
      In [51]: np.diagonal(a)[:] = np.ravel(b)
      

      但这不起作用,因为np.diagonal() 返回底层数组的只读视图:

      In [51]: np.diagonal(a)[:] = np.ravel(b)
      ---------------------------------------------------------------------------
      ValueError                                Traceback (most recent call last)
      <ipython-input-51-ac0ada1b350d> in <module>()
      ----> 1 np.diagonal(a)[:] = np.ravel(b)
      
      ValueError: assignment destination is read-only
      

      运行 help(np.diagonal) 揭示了这种行为,并揭示了在未来的某个时候,上面的矢量化表达式将起作用,因为 np.diagonal() 将返回一个 可变 切片数组:

      在 1.7 之前的 NumPy 版本中,此函数总是返回一个新的, 包含对角线值副本的独立数组。

      在 NumPy 1.7 和 1.8 中,它继续返回对角线的副本, 但根据这一事实已被弃用。写入结果 数组继续像以前一样工作,但会发出 FutureWarning。

      从 NumPy 1.9 开始,它返回原始数组的只读视图。 尝试写入结果数组会产生错误。

      在未来的某个版本中,它将返回一个读/写视图并写入 返回的数组将改变您的原始数组。返回的数组 将具有与输入数组相同的类型。

      但是,Numpy(当前版本为 1.13)仍然返回一个 不可变 切片。

      对于任何想加入 Numpy 并做出贡献的人来说,这将是一个很棒的第一个拉取请求。

      编辑:我将问题解释为询问如何使用给定 10 x 10 矩阵中的 100 个条目,并将它们分配给 100 x 100 矩阵的 100 个对角线条目。也许您的意思是使用 10 个 10x10 矩阵设置 100 x 100 矩阵的 10 个单独的 10 x 10 块。 (在这种情况下,指定您有 10 个 10x10 矩阵或包含一张图片会很有帮助。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-09
        • 1970-01-01
        • 2021-12-12
        • 2015-05-21
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多