使用numpy

时间:2019-02-03 20:14:59

标签: python

嘿,我想尝试使用numpy解决以下问题:给定两个不同大小的二次矩阵和一个带有行索引信息的Textfile。我想在对应的索引处将较小矩阵的行添加到较大矩阵的行。例如:

小矩阵表示为

    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循环,但是根本没有用。

1 个答案:

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

该列表定义在位置m2m1[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]