如何将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
相关产品推荐
相关产品推荐

