方法#1
创建一个掩码(用于内存+性能。效率),将1s/True分配给目标给定的索引(以1开头时偏移一个),最后使用视图转换为int数组 -
mask = np.zeros((len(target), 3), dtype=bool)
mask[np.arange(len(target)),target-1] = 1
out = mask.view('i1')
如果需要最终输出为浮点数,请在开始时使用float dtype 初始化mask,并跳过最终的int 转换。
方法 #2
另一个通过在identity-matrix 上使用偏移target 进行索引来进行散列 -
np.eye(3, dtype=bool)[target-1].view('i1')
方法#3
直接用target散列-
np.eye(4, k=-1, dtype=bool)[target,:-1].view('i1')
大型数据集的时序 -
In [46]: target = np.random.randint(1,4,1000000)
In [47]: %%timeit
...: mask = np.zeros((len(target), 3), dtype=bool)
...: mask[np.arange(len(target)),target-1] = 1
10.3 ms ± 48.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [48]: %timeit np.eye(3, dtype=bool)[target-1]
14.3 ms ± 241 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [49]: %timeit np.eye(4, k=-1, dtype=bool)[target]
13.1 ms ± 80.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)