使用 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 编码?的主要内容,如果未能解决你的问题,请参考以下文章
从 Numpy 中的 N 个向量中找到所有唯一的(几乎)平行 3d 向量对的最快方法
Python 中的多处理:Numpy + 向量求和 -> 大幅减速
python使用numpy中的equal函数比较两个numpy数组中每个位置的元素是否相同并计算相同元素的比例