You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Numpy按列表切片疑问:如何提取行列对应的子矩阵

解决NumPy非连续行列索引提取子矩阵的问题

嘿,我完全懂你遇到的这个小坑——当你用非连续的行列索引列表提取子矩阵时,NumPy的默认花式索引会返回一维数组,而不是你想要的二维子矩阵。别担心,这里有两个简单靠谱的解决办法:

方法1:使用np.ix_()构建网格索引

np.ix_()函数专门用来把一维索引数组转换成能生成二维子矩阵的索引对,它会帮你把行和列的索引扩展成网格形式,让NumPy按笛卡尔积提取元素。

示例代码:

import numpy as np

# 初始化6×6单位矩阵
mat = np.diag((1,1,1,1,1,1))
# 目标行列索引
indices = [0,1,2,5]

# 提取4×4子矩阵
sub_matrix = mat[np.ix_(indices, indices)]
print(sub_matrix)

输出结果:

[[1 0 0 0]
 [0 1 0 0]
 [0 0 1 0]
 [0 0 0 1]]

方法2:分步提取行和列

另一种更直观的方式是先提取指定的行,再从结果中提取指定的列,这样也能得到目标子矩阵:

示例代码:

import numpy as np

mat = np.diag((1,1,1,1,1,1))
indices = [0,1,2,5]

# 先取指定行(得到4×6矩阵),再取指定列
sub_matrix = mat[indices][:, indices]
print(sub_matrix)

这个方法的输出和方法1完全一致,而且不需要额外调用np.ix_(),适合喜欢简洁写法的同学。

为什么原来的写法不行?

你之前用的mat[[0,1,2,5],[0,1,2,5]]属于配对式索引,NumPy会逐个取对应位置的元素:(0,0)、(1,1)、(2,2)、(5,5),所以返回的是一维数组。而我们需要的是所有行索引和列索引的组合,也就是每一行都对应所有指定的列,上面两种方法正好实现了这个逻辑。

内容的提问来源于stack exchange,提问作者family

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:57:58