我已经生成了一个随机对称的100 x 100矩阵。我还生成了许多随机10 x 10对称矩阵。现在我想沿着100 x 100的对角线插入这10个块。我该怎么做呢?
我考虑过获取对角线索引,然后插入
B[diag1, diag2] = A
但我似乎无法将对角线索引输出到代码中。
答案 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矩阵 - 或包含图片会很有帮助。)