使用 NumPy 从 Python 中的位置向量中没有 for 循环的 One-Hot 编码?

Posted

技术标签:

【中文标题】使用 NumPy 从 Python 中的位置向量中没有 for 循环的 One-Hot 编码?【英文标题】:One-Hot Encoding without for-loop from vector of positions in Python with NumPy? 【发布时间】:2018-05-05 10:13:56 【问题描述】:

我有一些想要“单热编码”的数据,它表示为位置的一维向量。

NumPy 中是否有任何函数可以将我的x 扩展为我的x_ohe

在观看Jake Vanderplas's talk 之后,我会不惜一切代价避免在 Python 中使用 for 循环来进行此类操作

x = np.asarray([0,0,1,0,2])
x_ohe = np.zeros((len(x), 3), dtype=int)
for i, pos in enumerate(x):
    x_ohe[i,pos] = 1
x_ohe
# array([[1, 0, 0],
#        [1, 0, 0],
#        [0, 1, 0],
#        [1, 0, 0],
#        [0, 0, 1]])

【问题讨论】:

【参考方案1】:

如果x 只包含非负整数,您可以将x 与使用numpy broadcasting 的序列进行比较并将结果转换为ints:

(x[:,None] == np.arange(x.max()+1)).astype(int)

#array([[1, 0, 0],
#       [1, 0, 0],
#       [0, 1, 0],
#       [1, 0, 0],
#       [0, 0, 1]])

或者先初始化,再赋值使用advanced indexing

x_ohe = np.zeros((len(x), 3), dtype=int)
x_ohe[np.arange(len(x)), x] = 1
x_ohe

#array([[1, 0, 0],
#       [1, 0, 0],
#       [0, 1, 0],
#       [1, 0, 0],
#       [0, 0, 1]])

【讨论】:

【参考方案2】:

一个班轮:

np.equal.outer(x,range(3)).astype(int)

array([[1, 0, 0],
       [1, 0, 0],
       [0, 1, 0],
       [1, 0, 0],
       [0, 0, 1]])

np.equal.outer(x,np.unique(x)).astype(int) 也在这里工作。

【讨论】:

以上是关于使用 NumPy 从 Python 中的位置向量中没有 for 循环的 One-Hot 编码?的主要内容,如果未能解决你的问题,请参考以下文章

Python: 向量矩阵和多维数组(基于NumPy库)

从 Numpy 中的 N 个向量中找到所有唯一的(几乎)平行 3d 向量对的最快方法

Python 中的多处理:Numpy + 向量求和 -> 大幅减速

python使用numpy中的equal函数比较两个numpy数组中每个位置的元素是否相同并计算相同元素的比例

python/numpy/tensorflow中,对矩阵行列操作,下标是怎么回事儿?

第四十篇 Numpy.array的基本操作——向量及矩阵的运算