如何使用Numpy从二维矩阵中精准提取指定数值?
从二维Numpy矩阵提取指定子数组的正确方法
首先给出可正常运行的原矩阵定义(补充了元素间的逗号,避免语法错误):
import numpy as np a = np.array( [[ 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30]] )
需要提取的目标子数组为:
[[11,12],[16,17],[29,30]]
错误原因分析
ChatGPT给出的a[[2, 3, 5], [0, 1, 1]]属于Numpy的配对花式索引,会依次取(2,0)、(3,1)、(5,1)三个位置的元素,最终得到[11 17 27],和需求不符。
正确解决方案
方法一:分块提取+拼接(最直观)
先提取连续的子块,再拼接零散的部分:
# 提取第3、4行(索引2、3)的前两列 part1 = a[2:4, :2] # 提取第6行(索引5)的最后两列,重塑为二维数组 part2 = a[5, 3:].reshape(1, 2) # 垂直拼接两个部分 result = np.vstack([part1, part2]) print(result)
输出结果:
[[11 12] [16 17] [29 30]]
方法二:构造完整索引数组(一次性提取)
通过构造所有目标元素的行和列索引,提取后重塑形状:
# 定义所有目标元素的行索引 rows = [2, 2, 3, 3, 5, 5] # 定义所有目标元素的列索引 cols = [0, 1, 0, 1, 3, 4] # 提取元素并重塑为3行2列的数组 result = a[rows, cols].reshape(3, 2) print(result)
也可以用np.r_简化索引构造:
result = a[np.r_[2,2,3,3,5,5], np.r_[0,1,0,1,3,4]].reshape(3,2)
方法三:列表推导式(适合小矩阵场景)
遍历所有目标位置,逐个提取后组合:
# 定义所有目标元素的坐标 target_positions = [(2,0), (2,1), (3,0), (3,1), (5,3), (5,4)] # 提取元素并转为指定形状的数组 result = np.array([a[pos] for pos in target_positions]).reshape(3,2) print(result)
内容的提问来源于stack exchange,提问作者xangetsue
相关产品推荐
相关产品推荐

