如何正确选取NumPy ndarray中的指定区域?
正确选取NumPy ndarray指定区域的方法
错误原因分析
你遇到的IndexError: shape mismatch是因为直接使用M[a,b]时,NumPy会将a和b视为配对索引(即取M[a[0],b[0]]、M[a[1],b[1]]这类对应位置的元素),但你的a长度为2,b长度为3,两者形状无法广播匹配,因此报错。而你实际需要的是选取**a中所有行与b中所有列的笛卡尔积区域**(即二维子矩阵),需要用专门的索引方式实现。
注意:修正索引数组
从你给出的期望结果来看,目标行应该是[0,2,3](对应结果的三行),目标列是[0,2](对应结果的两列),而非原代码中的a=[0,2]和b=[0,2,3],先修正这两个索引数组。
解决方案
方法1:使用np.ix_()构造索引网格
np.ix_()会将一维索引数组转换为可广播的二维网格,直接生成行×列的子矩阵:
import numpy as np # 给定的矩阵M M = np.array([[0.36899449, 0.02531732, 0.04966994, 0.66058884, 0.26193009], [0.92893864, 0.10193024, 0.74850916, 0.72822403, 0.09112129], [0.28863096, 0.45470087, 0.01032583, 0.30931807, 0.42765045], [0.59819051, 0.94057773, 0.95352287, 0.81818564, 0.24220261]]) # 修正后的目标行和列索引 a = [0, 2, 3] b = [0, 2] # 使用np.ix_()选取区域 selection = M[np.ix_(a, b)] print(selection)
运行结果:
[[0.36899449 0.04966994] [0.28863096 0.01032583] [0.59819051 0.95352287]]
方法2:手动调整索引形状实现广播
将行索引转换为列向量(形状(n,1)),列索引保持一维(形状(m,)),利用NumPy的广播机制生成索引网格:
selection = M[np.array(a)[:, np.newaxis], b]
此方法与np.ix_()效果完全一致,适合需要手动控制索引形状的场景。
内容的提问来源于stack exchange,提问作者deijany91
相关产品推荐
相关产品推荐

