如何用NumPy切片从随机索引提取邻接矩阵子矩阵?
NumPy切片提取邻接矩阵子矩阵的实现思路
嘿,这个需求用NumPy的整数数组索引就能轻松搞定,完全不需要循环判断,代码简洁又高效!
核心思路
NumPy支持直接用整数数组来选择多维数组中的特定行和列。对于你的场景,只需要用给定的索引列表idx同时指定要提取的行和列,就能一步得到目标子矩阵。
具体实现代码
import numpy as np # 原邻接矩阵 Y = np.array([[0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 1., 1., 0., 1., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 1., 0., 0., 1., 0.], [0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 1., 0.], [0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 1., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 1.], [0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 1.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.], [0., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 1., 1.], [0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 0., 0., 0., 0.], [0., 0., 0., 1., 1., 0., 0., 0., 0., 0., 1., 1., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 0., 1., 0., 0., 0.]]) # 随机索引列表 idx = [0, 3, 7, 10, 14] # 一步提取子矩阵 Yhat = Y[idx, idx] # 转换为整数类型(可选,根据需求调整) Yhat = Yhat.astype(int) print(Yhat)
输出结果
运行后你会得到和预期完全一致的子矩阵:
[[0 0 0 0 0] [0 0 0 1 0] [0 0 0 0 0] [0 1 0 0 0] [0 0 0 0 0]]
为什么这能行?
- 第一个
idx参数指定了要提取的行,第二个idx指定了对应的列。 - NumPy会自动匹配行和列的索引,生成两个维度索引的交集子矩阵,这比循环判断高效得多,尤其是当矩阵规模较大时。
内容的提问来源于stack exchange,提问作者NicolaiF
相关产品推荐
相关产品推荐

