Python2下如何用NumPy索引数组快速查找矩阵值生成新矩阵?
在Python 2中用索引数组快速生成NumPy新矩阵的方法
嘿,在Python 2的NumPy环境里,要实现用索引数组快速查找并生成新矩阵,最快的方式得看你的索引结构,但最通用且高效的无非两种:高级索引和np.take()函数——这俩都是底层用C实现的向量化操作,完全避开了Python解释器的循环开销,比手写循环快N倍。
下面分两种常见场景给你举例:
场景1:有分开的行/列索引矩阵
如果你的索引是拆成两个形状相同的矩阵(一个存行索引,一个存列索引),直接用NumPy的高级索引是最直观高效的:
import numpy as np # 示例原矩阵X X = np.array([[1, 2], [3, 4]]) # 行索引矩阵:每个位置对应要取的X的行号 row_idx = np.array([[0, 1], [1, 0]]) # 列索引矩阵:每个位置对应要取的X的列号 col_idx = np.array([[1, 0], [1, 1]]) # 生成新矩阵:每个位置取X[row_idx[i,j], col_idx[i,j]] new_matrix = X[row_idx, col_idx] # 输出结果:[[2, 3], [4, 1]]
场景2:有扁平化的索引数组
如果你的索引是X扁平化后的一维索引(比如把X按行展开成一维数组后的下标),或者想把一维索引转换成多维新矩阵,用np.take()会更顺手:
# 还是用上面的X矩阵 flat_indices = np.array([1, 2, 3, 0]) # 对应X[0,1], X[1,0], X[1,1], X[0,0] # 取出值后重塑成目标形状 new_matrix = np.take(X, flat_indices).reshape(2, 2) # 输出结果同样是:[[2, 3], [4, 1]]
额外小技巧:如果索引是二维元组形式
要是你的索引是每个元素为(行号, 列号)的二维数组,可以先把它拆成行、列两个矩阵,再用场景1的方法:
indices = np.array([[(0,1), (1,0)], [(1,1), (0,0)]]) # 拆分出索引矩阵 row_idx = indices[:, :, 0] col_idx = indices[:, :, 1] new_matrix = X[row_idx, col_idx]
最后提醒一句:在Python 2里尽量用支持它的最新NumPy版本(比如1.16.x系列),这些版本的向量化操作性能优化得更好,能让上述方法跑得更快。
内容的提问来源于stack exchange,提问作者ru111
相关产品推荐
相关产品推荐

