我在numpy中有一个数据集,有一个x向量和一个y向量。y向量只有两个值+1或-1(或0或1),因为它是一个二进制值函数。我知道我可以在数据集上循环,如果我看到+1,就把它映射到1,如果我看到-1,就把它逐个映射到0。然而,我希望给定整个向量y = [N x 1]
一步映射到一个向量y = [N x 2]
,因为它可能非常大,所以我想尽快完成(我也不想保存数据集的副本两次)。你知道吗
在python中有没有一种矢量化的方法可以快速地进行这种转换?你知道吗
以下是循环代码供参考:
def transform_data_to_one_hot(X,Y):
N,D = Y.size
Y_new = np.zeros(N,D)
for i in range(N):
if y == -1:
Y_new[i] = np.array([1,0])
else:
Y_new[i] = np.array([0,1])
return Y_new
让我们使用Radamacher变量(即+1、-1而不是0和1)来执行奇偶校验函数。在这种情况下,奇偶函数只是乘积函数:
>>> X = np.array([[-1,-1],[-1,1],[1,-1],[1,1]])
>>> X
array([[-1, -1],
[-1, 1],
[ 1, -1],
[ 1, 1]])
>>> Y = np.reshape(np.prod(X,axis=1),[4,1])
>>> Y
array([[ 1],
[-1],
[-1],
[ 1]])
当Y向量为1时,应为:
>>> Y
array([[ 0,1],
[1,0],
[1,0],
[ 0,1]])
这里有一个基于初始化的-
样本运行-
使用
initialization
方法的其他方法-这两个新添加的内容只是在设置列索引的方式上有所不同。对于版本2,我们只使用:
(y+1)//2
计算,而对于版本3
则使用:yc = y.copy(); yc[yc==-1] = 0
。你知道吗另一个非常接近^{} ,但使用布尔数组-
运行时测试-
一些简单的观察可以提高效率:
concatenate
empty
比zeros
快,如果你只想覆盖那些零out
参数,避免使用临时变量请仔细选择您的数据类型-因为您选择了错误的类型将招致副本
也可以使用sklearn.preprocessing.OneHotEncoder方法。你知道吗
注意:它不接受负数,所以我们必须替换它们。你知道吗
演示:
结果:
源阵列:
熊猫解决方案:
相关问题 更多 >
编程相关推荐