【问题标题】:Adding a vector to a specific row of a matrix with numpy使用 numpy 将向量添加到矩阵的特定行
【发布时间】:2019-02-03 20:14:59
【问题描述】:

嘿,我想尝试使用 numpy 解决以下问题:给定两个不同大小的二次矩阵和一个包含行索引信息的文本文件。我想将较小矩阵的行添加到相应索引处的较大矩阵的行中。例如:

小矩阵为

    1 2 3 
    4 5 6
    7 8 9

大矩阵是一个零矩阵,例如大小为 8

    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0

文本文件现在包含以下条目:

    1
    3
    6

现在必须将较小矩阵的第一行添加到较大矩阵的第一行。第二行到第三行,最后一行添加到第六行,即

    1 2 3 0 0 0 0 0
    0 0 0 0 0 0 0 0
    0 0 4 5 6 0 0 0
    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0
    0 0 0 0 0 7 8 9
    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0      

我尝试了很多 for 循环,但它根本不起作用。

【问题讨论】:

  • 如何确定要添加的给定行中的起始列?
  • 请注意,Python 和 numpy 中的索引是从零开始的,因此您的示例实际上已添加到行 025。这真的是你想要的吗?另外,什么是“二次矩阵”?
  • 是的,这就是我想要的。在德国,如果矩阵具有 (n,n) 的形状,我们称其为二次矩阵。起始列与行相同。

标签: python


【解决方案1】:

假设您有 2 个矩阵:

import numpy as np

m1 = np.matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9,]])
m2 = np.empty([8, 8])
m2.fill(0)

并定义了一个职位列表:

li = [1, 3, 6]

该列表定义将矩阵m2 的值替换为矩阵m1 在位置[0][0:2][2][2:4][5][5:7] 处的行。

numpy 数组的值可以替换为numpy.put()
计算要替换的值的索引并替换值:

ri = [(v-1) * m2.shape[1] + v - 1 + j for v in li for j in range(m1.shape[1])]
np.put(m2, ri, m1)

输出:

print(m1)
print(li)
print(m2)
[[1 2 3]
 [4 5 6]
 [7 8 9]]
[1, 3, 6]
[[1. 2. 3. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 4. 5. 6. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 7. 8. 9.]
 [0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0.]]

如果您不想替换索引,但要将值添加到当前矩阵,则必须在循环中对值求和,而不是替换为 np.put

for i in range(len(ri)):
    m2.flat[ri[i]] += m1.flat[i] 

【讨论】:

  • 如果我有另一个小矩阵 M3 我也可以使用 np.put 它将被添加还是被替换?编辑:我刚试过。它将取代它。有办法添加吗?
  • 是的,如果我有一个相同大小的较小矩阵 M3 和相同的位置列表,它应该添加值。 np.put 正在替换它们。有添加它们的命令吗?
  • @Kerem 查看答案的扩展。
猜你喜欢
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 2014-07-06
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多