np.eye生成onehot矩阵要求标签为从0开始的连续整数,否则需先标准化索引;字符串或非连续整数标签须用np.unique(..., return_inverse=true)转换;注意dtype、shape及内存效率问题。

np.eye 生成 OneHot 矩阵时,标签必须是整数且从 0 开始
直接用 np.eye(n_classes)[labels] 是最常用做法,但前提是 labels 中每个值都得是 0 到 n_classes-1 的整数。如果原始标签是字符串(如 ['cat', 'dog', 'cat'])或非连续整数(如 [1, 5, 1]),会直接报错或生成错位矩阵。
实操建议:
- 先用
np.unique(labels, return_inverse=True)获取标准化索引,再喂给np.eye - 若已知类别数,可用
labels = np.array(labels) - labels.min()对齐起点(仅适用于整数偏移场景) - 避免手动写
np.eye(3)[[1,0,2]]这类硬编码——索引越界时不会报错,但结果全为零行,极难排查
用 np.eye 做 OneHot 比 sklearn.preprocessing.OneHotEncoder 更快但更脆
np.eye 是纯数组切片,无类型检查、无稀疏支持、不处理缺失值,适合已清洗好的整数标签批量转换;而 OneHotEncoder 自动做 label encoding + one-hot,适合 pipeline 场景但有额外开销。
性能对比(10 万样本):
-
np.eye(10)[y]:约 1.2 ms -
OneHotEncoder(sparse_output=False).fit_transform(y.reshape(-1,1)):约 8.5 ms
注意:np.eye 返回 float64 类型,若后续要喂给 PyTorch,需显式转 .astype(np.float32),否则可能触发隐式类型转换警告。
标签含负数或浮点数时,np.eye 索引会静默失败
np.eye(5)[[-1, 0, 2]] 不报错,但第一行取的是最后一行(-1 索引合法),np.eye(5)[[0.5, 1.9]] 会触发 IndexError: arrays used as indices must be of integer (or boolean) type。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
常见错误现象:
- 输入
[0, 1, 2, 1]正常,但输入[0.0, 1.0, 2.0, 1.0]报错 —— 即使值一样,dtype 是float64就不行 - 用
pandas.Series.astype(int)转换含 NaN 的列,会变成float64(因 NaN 强制升格),此时np.eye[n][s.values]必炸
安全写法:labels = np.asarray(labels).astype(int, casting='safe'),加 casting='safe' 可捕获非法转换(如 np.nan → int)。
one-hot 结果维度不对?检查 labels.shape 是否为 (N,) 而非 (N, 1)
np.eye(3)[labels] 要求 labels 是一维,若你传入列向量(如 y.reshape(-1, 1)),会触发 IndexError: too many indices for array。
典型误操作:
- 从 pandas DataFrame 取列:用
df['label'].values(正确),别用df[['label']].values(得到二维) - 从 scikit-learn 的
train_test_split返回的 y_train 默认是一维,但若你写了y_train = y_train[:, None]就埋了雷 - 调试时打印
labels.shape和labels.dtype应成习惯,比猜快得多
最易被忽略的一点:当类别数远大于样本数(比如 1000 类但只有 5 个样本),np.eye(n_classes) 会先分配一个巨大的全零矩阵,再切片——内存峰值高得离谱。这种场景下,应该用 scipy.sparse.csr_matrix((np.ones(len(labels)), (range(len(labels)), labels)), shape=(len(labels), n_classes)) 替代。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










