嘿,我想尝试使用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循环,但是根本没有用。
答案 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]
该列表定义在位置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]