NumPy中通过行列索引选子矩阵赋值后原矩阵未变化的问题
问题分析与解决方案
问题根源
你的代码没能修改原矩阵A,核心原因是连续两次切片操作生成了临时副本,而非直接操作原矩阵的视图:
A[[9,3,4,5],:]会返回一个新的4×10数组(原矩阵的副本),不是原矩阵的引用- 后续
[:,[9,3,4,5]]是对这个临时副本做切片,赋值操作只改动了这个临时数组,原矩阵A完全没被触及
正确实现方式
如果你想选中A中**行索引为[9,3,4,5]且列索引为[9,3,4,5]**的4×4子矩阵并赋值,需要用np.ix_将一维行列索引转换为二维网格索引,确保操作的是原矩阵的视图:
import numpy as np A = np.zeros((10, 10)) B = np.ones((4,4)) rows = [9,3,4,5] cols = [9,3,4,5] # 用np.ix_生成网格索引,直接操作原矩阵的子矩阵视图 A[np.ix_(rows, cols)] = B print(A)
补充说明
np.ix_(rows, cols)会把两个一维索引数组转换成可广播为二维的结构,这样A[np.ix_(rows, cols)]就能准确选中你需要的4×4子矩阵,且这是原矩阵的视图,赋值会直接生效- 如果直接写
A[rows, cols],numpy会按元素对应关系选取(即(9,9)、(3,3)、(4,4)、(5,5)这四个元素),得到的是一维数组,不符合修改4×4子矩阵的需求
内容的提问来源于stack exchange,提问作者Arsenii
相关产品推荐
相关产品推荐

