如何在Python中由行列号求索引?适配np.put()函数需求
解决二维矩阵行号列号转一维索引的问题
嘿,这个问题其实挺 straightforward 的,咱们直接说核心解法就行——对于 numpy 默认的行优先(C 风格)存储的二维矩阵,一维索引的计算公式是:行号 × 矩阵的列数 + 列号
为什么这个公式管用?
numpy 里的二维矩阵在内存里是按行连续存储的,比如你的 6×6 矩阵,第0行的元素占据索引0-5,第1行是6-11,以此类推。所以第r行的第一个元素的索引就是 r × 列数,再加上列号c,就是对应位置的一维索引了。
针对你的示例的具体代码
import numpy as np heatmap = np.zeros((6,6), dtype=int) r, c = 3, 3 # 你要找的data[3,3] # 计算对应的一维索引 flat_index = r * heatmap.shape[1] + c # shape[1]就是矩阵的列数,这里是6 # 用np.put测试一下 np.put(heatmap, flat_index, 100) # 验证结果 print(heatmap[3, 3]) # 输出100,说明赋值成功 print(heatmap.flatten()[flat_index]) # 同样输出100,确认索引对应正确
补充说明
如果你的矩阵是按列优先(Fortran 风格)存储的(比如用 np.zeros((6,6), order='F') 创建的),那公式就要换成 列号 × 矩阵的行数 + 行号,不过 numpy 默认都是行优先,所以一般用第一个公式就够了。
之前你试的 where()、enumerate() 这些函数其实都不是干这个活的——where 是用来筛选满足条件的元素索引,enumerate 是遍历用的,它们都不是直接做二维到一维索引转换的工具,这个转换本质就是个简单的数学计算,不用复杂函数~
内容的提问来源于stack exchange,提问作者Random Data
相关产品推荐
相关产品推荐

