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

如何将numpy整数数组高效转换为对应位为1的二进制数组(无循环)

无需循环的高效实现方案

当然有更高效的实现方式!numpy最擅长的就是用矢量化操作替代Python循环,既能让代码更简洁,运行速度也会快很多,尤其是当你的数组规模比较大的时候。下面给你两种常用的方法:

方法一:利用np.eye直接索引

np.eye(n)会生成一个n×n的单位矩阵,我们可以直接用你的索引数组去提取对应行,一步到位得到独热编码数组:

import numpy as np

dummy_indices = np.array([0,1,2,0,0,1,3])
num_classes = 1 + np.max(dummy_indices)
# 直接通过索引获取单位矩阵的对应行
dummy_array = np.eye(num_classes)[dummy_indices]

运行后得到的结果和你要的完全一致,而且全程没有循环,numpy内部会用优化后的C代码执行操作,速度比循环快得多。

方法二:高级索引批量赋值

如果你更倾向于手动初始化数组,也可以用numpy的高级索引一次性完成赋值,同样不需要循环:

import numpy as np

dummy_indices = np.array([0,1,2,0,0,1,3])
num_samples = dummy_indices.shape[0]
num_classes = 1 + np.max(dummy_indices)

dummy_array = np.zeros((num_samples, num_classes), dtype=np.float64)
# 用arange生成行索引,和dummy_indices配对完成批量赋值
dummy_array[np.arange(num_samples), dummy_indices] = 1

这种方法的核心是利用np.arange(num_samples)生成每个元素的行位置,再和列索引dummy_indices配对,一次性给所有目标位置赋值为1,避免了Python层面的循环开销。

为什么这两种方法更快?

你原来的循环是在Python层面逐行遍历,每次循环都要做一次索引赋值,当数组规模变大(比如十万、百万级元素)时,这种操作的开销会非常大。而矢量化操作是把整个数组的计算交给numpy的底层C实现,能充分利用CPU的向量化指令,效率提升非常明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:27:40