Python:如何沿着较大矩阵

时间:2017-09-30 09:48:14

标签: python matrix diagonal

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

我考虑过获取对角线索引,然后插入

B[diag1, diag2] = A

但我似乎无法将对角线索引输出到代码中。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

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

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()将返回 mutable 数组的切片:

  

在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矩阵设置10个独立的10 x 10块100 x 100矩阵。 (在这种情况下,指定您有10个10x10矩阵 - 或包含图片会很有帮助。)