我做了一个简单的函数,当输入一个向量时,它将返回一个输出的一个热编码矩阵。在
import numpy as np
def ohc(x):
u = list(set(x))
c = len(u)
X = np.zeros((len(x), c))
for idx, val in enumerate(x):
for i in range(c):
if val == u[i]:
X[idx, i] = 1
return X
inputx = np.random.randint(1, 4, 1000000)
ohc(inputx)
Out[2]:
array([[ 0., 1., 0.],
[ 0., 1., 0.],
[ 0., 1., 0.],
...,
[ 0., 0., 1.],
[ 0., 1., 0.],
[ 0., 1., 0.]])
但我想知道是否因为这两个for循环,有没有办法加快速度?在
^{pr2}$
这里有一个矢量化方法,只使用^{} 中的唯一值,与原始数组进行比较,从而得到一个热编码数组-
运行时测试
其他方法-
^{pr2}$时间安排-
进一步提高性能-
使用
np.int8
作为输出数据类型,以便通过建议的方法进一步提高性能-正如@paulpanzer建议的那样,我们也可以使用
view
来代替类型转换,以进一步增强数组的唯一性-您的代码在O(n[因为set()]+nc[因为for循环])。在大多数实际应用程序中,最终都会得到O(nc)*,因为您需要为数组分配空间。不过,有几个技巧可以让它更高效:
以下是我的实现:
*根据您打算如何处理X矩阵,您可能需要使用numpy.稀疏你的矩阵不能分配很多内存
看起来是
np.unique
的工作针对@Divakar的基准测试:这里有一个信息更丰富的比较,证实了}的几倍优势。这是预期的,因为
^{pr2}$dv
在小字母表中的一个轻微的速度优势,它在K=20
附近交叉,在K=1000
处,它又反过来成为{pp
利用了一个热的稀疏性。下面,K是字母表的大小,N是样本的长度。在印刷品:
使用
uint8
并允许@Divakar的方法使用更便宜的视图转换:相关问题 更多 >
编程相关推荐