如何基于坐标数组替换矩阵指定位置的值?
解决Numpy矩阵指定坐标赋值的问题
嘿,我明白你遇到的问题了——用matrix[coords]=1的时候不小心把整个矩阵都变成1了,这是因为Numpy的索引规则和你想的不太一样。
为什么原来的写法会出错?
当你用matrix[coords]这种方式索引时,Numpy会把coords这个二维数组拆解成行索引数组和列索引数组(也就是coords[:,0]和coords[:,1]),然后通过广播机制生成一个3x3的索引矩阵,最终给所有位置都赋了值,这就是为什么你得到全1矩阵的原因。
正确的赋值方法
有两种简单的方式可以实现你想要的效果:
方法1:拆分坐标为行和列的一维数组
把coords转置后拆分,分别作为行和列的索引:
import numpy as np matrix = np.zeros((3,3), dtype=int) coords = np.array([[0,0],[2,1],[0,2]]) # 拆分坐标 rows, cols = coords.T matrix[rows, cols] = 1 print(matrix)
输出结果:
array([[1, 0, 1], [0, 0, 0], [0, 1, 0]])
方法2:将坐标数组转为元组
Numpy接受元组形式的索引,把转置后的coords转为元组,直接作为索引:
import numpy as np matrix = np.zeros((3,3), dtype=int) coords = np.array([[0,0],[2,1],[0,2]]) matrix[tuple(coords.T)] = 1 print(matrix)
同样会得到你期望的输出。
原理说明
这两种方法本质上都是告诉Numpy:用coords里的第一个元素作为行索引,第二个作为列索引,逐个定位到矩阵的单个元素,而不是触发广播生成整个矩阵的索引。这样就能精准地给指定位置赋值为1啦!
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

