Python、Numpy:如何用给定掩码选择数组及剩余元素
解决Numpy中选取矩阵剩余列的问题
嘿,这个需求在Numpy里其实有挺直观的解决方式,分两种常见场景给你说明:
情况1:掩码m是布尔数组(最常用的场景)
如果你的掩码m是长度为250的布尔数组(True对应要保留的列,False对应要排除的列),那直接对掩码取反就能拿到剩余列,代码超简洁:
import numpy as np # 假设A是(10000, 250)的矩阵,m是长度250的布尔掩码 remaining_columns = A[:, ~m]
这里的~是Numpy的按位取反操作,能直接把布尔数组里的True和False互换,刚好对应你要的剩余列。
情况2:掩码m是列索引数组(像你示例里的[1,2,4,...]这种)
如果m是你选中的列的索引列表/数组,我们可以先拿到所有列的索引,再计算出和m的差集,分两种小情况:
方法A:不需要保持原列顺序
用np.setdiff1d直接求差集,它会返回排序后的剩余列索引:
all_cols = np.arange(A.shape[1]) # 生成0到249的所有列索引 remaining_cols = np.setdiff1d(all_cols, m) result = A[:, remaining_cols]
方法B:需要保持原列顺序
如果不想改变列的原始顺序,就用np.in1d生成"不在m中"的布尔掩码,再筛选索引:
all_cols = np.arange(A.shape[1]) # 生成标记"不在m里"的布尔掩码 mask = np.in1d(all_cols, m, invert=True) remaining_cols = all_cols[mask] result = A[:, remaining_cols]
这样得到的剩余列会和原矩阵A的列顺序完全一致,不会被自动排序。
另外提一句,你示例里写的A[([1,2,...])]其实是在选取行哦,如果要选列的话,记得加上逗号,写成A[:, 索引数组]的形式~
内容的提问来源于stack exchange,提问作者null
相关产品推荐
相关产品推荐

