【发布时间】:2017-08-20 23:27:17
【问题描述】:
我有一个 ndarray:
ndaM = np.array([[1,2,3],[4,5,6],[7,8,9]]);
和一个0和1的向量:
vSet = [0,1,1];
如何使用vSet 提取只有在vSet 中索引为非零的行和列的子矩阵?在这种情况下,矩阵
[[5,6],[8,9]]
【问题讨论】:
标签: python numpy indexing boolean slice
我有一个 ndarray:
ndaM = np.array([[1,2,3],[4,5,6],[7,8,9]]);
和一个0和1的向量:
vSet = [0,1,1];
如何使用vSet 提取只有在vSet 中索引为非零的行和列的子矩阵?在这种情况下,矩阵
[[5,6],[8,9]]
【问题讨论】:
标签: python numpy indexing boolean slice
这是一个使用np.ix_一次性切片的解决方案
ndaM[np.ix_(*2*(np.array(vSet, bool),))]
# array([[5, 6],
# [8, 9]])
或者更易读的两行
mask = np.array(vSet, bool)
ndaM[np.ix_(mask, mask)]
【讨论】:
np.ix_ 将np.nonzero (np.where) 应用于布尔输入以将其转换为数字索引。 (array([[1], [2]]), array([[1, 2]]))。 `
您可以使用两步切片:
# convert vSet to a boolean array
bSet = np.array(vSet).astype(bool)
# slice in two steps, rows first, then columns
ndaM[bSet][:, bSet]
#array([[5, 6],
# [8, 9]])
或者使用np.ix_创建索引网格网格,然后用它来索引:
ndaM[np.ix_(bSet, bSet)]
#array([[5, 6],
# [8, 9]])
【讨论】: