NumPy如何将标签数组映射为对应索引为1的二进制数组
NumPy高效实现标签转对应位置1的二进制数组
你要实现的本质是0-9取值标签的独热编码转换,用NumPy的向量化操作可以完全避开Python层循环,性能远高于迭代写法,下面是两种可直接用的实现:
方法1:零数组索引赋值(性能最优,推荐大数据量场景用)
先初始化和目标形状一致的全0数组,再通过NumPy高级索引直接把对应位置设为1,没有多余内存开销:
import numpy as np labels = [1, 4, 9] labels = np.asarray(labels, dtype=int) # 初始化形状为(样本数, 10)的全0数组,0-9共10个取值位 binary = np.zeros((labels.size, 10), dtype=int) # 逐行对应标签位置赋值为1 binary[np.arange(labels.size), labels] = 1
运行输出和示例完全一致:
[[0 1 0 0 0 0 0 0 0 0] [0 0 0 0 1 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 1]]
方法2:单位矩阵索引(写法最简洁)
先生成10阶单位矩阵(第i行仅第i位为1),直接用标签值索引对应行即可,代码更短,性能和方法1差距极小:
binary = np.eye(10, dtype=int)[labels]
注意事项
- 两种方法都要求标签取值在0-9范围内,传入超出范围的值会触发索引越界错误,用之前可以先加
assert (labels >=0).all() and (labels <=9).all()做校验 - 如果需要对接深度学习框架常用的浮点类型,把
dtype=int改成对应类型比如np.float32即可
内容的提问来源于stack exchange,提问作者user2919910
相关产品推荐
相关产品推荐

