Python广播:如何在填充One-Hot向量时释放NumPy速度?

时间:2017-01-30 23:42:54

标签: python numpy numpy-broadcasting

为了使用张量流,我需要为我的类提供一个热矢量。

我有以下代码来创建一个单热矢量,但看起来它应该适合numpy广播。

def classVector2oneHot(classVector):
    uniques = np.asarray(list(set(classVector)))
    one_hot_array = np.zeros(shape=(classVector.shape[0],uniques.shape[0]),dtype=np.float32)

    starting_index = np.min(uniques)

    # where broadcasting seems like it should be possible, somehow...
    for i in range(len(one_hot_array)):
        one_hot_array[i,classVector[i]-starting_index] = 1



    return one_hot_array

1 个答案:

答案 0 :(得分:2)

以下是使用broadcasting -

的一种方法
(classVector[:,None] == uniques).astype(float)

示例运行 -

In [47]: classVector
Out[47]: array([15, 16, 24, 20, 14, 12, 14, 19, 12, 21])

In [48]: uniques = np.unique(classVector)

In [49]: uniques
Out[49]: array([12, 14, 15, 16, 19, 20, 21, 24])

In [50]: (classVector[:,None] == uniques).astype(float)
Out[50]: 
array([[ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.]])