python - 从对角线开始将向量写入矩阵

标签 python numpy

我有一个向量长度n和一个mxm矩阵。通常m >> n(mn大得多)。我需要从对角线开始将向量重复写入矩阵。例如:

向量 v = [v_1, v_2, v_3]4x4 零矩阵结果:

v_1,  v_2,  v_3,  0
0,    v_1,  v_2,  v_3
0,    0,    v_1,  v_2
0,    0,    0,    v_1

由于我必须经常这样做,因此它必须相当快。现在我正在原始 python 中循环矩阵的每一行并将向量写入所需的位置,但这很慢。

最佳答案

检查numpy.eye 。这对你有用吗?

v = [1,2,3]
N = 5
M = 10
arr = np.sum(np.eye(N, k=i, M=10) * j for i, j in enumerate(v))
arr
>>array([[1., 2., 3., 0., 0., 0., 0., 0., 0., 0.],
   [0., 1., 2., 3., 0., 0., 0., 0., 0., 0.],
   [0., 0., 1., 2., 3., 0., 0., 0., 0., 0.],
   [0., 0., 0., 1., 2., 3., 0., 0., 0., 0.],
   [0., 0., 0., 0., 1., 2., 3., 0., 0., 0.]])

编辑(感谢hpaulj建议):如果你的矩阵很大并且有很多0,你可以使用稀疏矩阵

from scipy.sparse import diags
arr = diags(v,offsets=[0,1,2],shape=(N,M))
print(arr.A)
>>array([[1., 2., 3., 0., 0., 0., 0., 0., 0., 0.],
   [0., 1., 2., 3., 0., 0., 0., 0., 0., 0.],
   [0., 0., 1., 2., 3., 0., 0., 0., 0., 0.],
   [0., 0., 0., 1., 2., 3., 0., 0., 0., 0.],
   [0., 0., 0., 0., 1., 2., 3., 0., 0., 0.]])

关于python - 从对角线开始将向量写入矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54313170/

相关文章:

javascript - 动态添加 jinja 模板

python - 使用 F5 在 Visual Studio 中调试单个 python 文件

python - Numpy 数组获取不是 NaN 的数组的子集/切片

python - Numpy - 查找数据点的最大点和值

python - 开源科学项目——使用 Python 2.6 还是 2.7?

python - 如何正确解析ctypes中的嵌套结构

python - 为什么 SendGrid 允许我从任何地址发送电子邮件?

python - 使用正则表达式从以某些字符开头的列中删除子字符串

python - 如何正确地将 mpmath 矩阵转换为 numpy ndarray(并将 mpmath.mpf 转换为 float )

python - 有效地改变numpy数组的顺序