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

Numpy多维数组布尔索引问题:按一维数组条件筛选元素

解决Numpy数组按对应标签筛选的问题

这个问题我之前也碰到过,核心是Numpy布尔索引的维度匹配问题,咱们一步步来解决:

问题原因分析

你的y是(1,100)的二维数组,当你执行y==0时,得到的是一个同样(1,100)的布尔数组。直接用这个数组去索引X(形状(3,100))时,Numpy会默认把布尔数组当作行索引来处理,但你的X只有3行,显然和(1,100)的掩码维度不匹配,所以会出错。

我们真正需要的是按列来筛选:因为X的每一列对应y中的一个元素,所以要在X的第二个维度(列维度)上应用掩码。

可行解决方案

这里有两种简单的方法,都能完美解决你的问题:

方法1:将y压缩为一维数组

用squeeze()或者flatten()把y从(1,100)转换成(100,)的一维数组,这样生成的掩码就是一维的,能直接匹配X的列维度:

import numpy as np

# 示例数据
y = np.random.randint(0, 2, (1, 100))
X = np.random.rand(3, 100)

# 筛选y=0对应的X列
mask_0 = y.squeeze() == 0
X_0 = X[:, mask_0]  # 结果形状为(3, n),n是y中0的个数

# 筛选y=1对应的X列
mask_1 = y.squeeze() == 1
X_1 = X[:, mask_1]

方法2:直接取y的第一行

因为y只有一行,直接通过索引y[0]获取一维的标签数组,再生成掩码:

# 筛选y=0对应的X列
mask_0 = y[0] == 0
X_0 = X[:, mask_0]

# 筛选y=1对应的X列
mask_1 = y[0] == 1
X_1 = X[:, mask_1]

验证结果

你可以通过打印X_0.shape和X_1.shape来确认结果:比如如果y中有40个0和60个1,那么X_0的形状会是(3,40),X_1是(3,60),完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:31:33