def onehot(label):
#label=[1,2,3,3]
#留下各异的标签
ulabel=np.unique(label)
#ulabel=[1,2,3]
#查看一下各异标签的数量。num_label=3
num_label=ulabel.shape[0]
#查看训练数据的个数n=4。
n=label.shape[0]
#初始化最终的one-hot的label。4*3列的最终向量是我们想要的。
"""
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
"""
flabel=np.zeros((n,num_label))
#双重循环判段哪一位应该由0改成1。
for i in range(n):
#判断第i个训练数据
for j in range(num_label):
#根据i数据对应的ulabel下标来判断哪一位由0改成1。
if(label[i]==ulabel[j]):
flabel[i][j]=1
return flabel
"""
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.],
[0., 0., 1.]])
"""
测试如下:
x=np.array([1,2,3,3])
onehot(x)
结果如下:
看懂了之后,把上面的注释去掉,如下:
def onehot(label):
#先看一下一共有几个标签
ulabel=np.unique(label)
num_label=ulabel.shape[0]
n=label.shape[0]
#初始化最终的one-hot的label.
flabel=np.zeros((n,num_label))
for i in range(n):
for j in range(num_label):
if(label[i]==ulabel[j]):
flabel[i][j]=1
return flabel
注意:
1.输入的标签序列label需要是numpy
类型。
2.对于标签label是字符串也同样适用,无需修改上述代码。
#标签是字符串
a=["sad","happy","angry","happy"]
a=np.array(a)
onehot(a)
TfidfVectorizer
这个东西恰巧是用于将文本向量化的,由于默认会归一化,发现对标签(只有一个单词或者数字的时候)使用的时候其恰好是one-hot
!!!!!想要详细了解的可以参考一个例子来使用sklearn中的TfidfVectorizer。如果只想使用one-hot功能,复制下述代码可以快速使用。
from sklearn.feature_extraction.text import TfidfVectorizer
#标签是字符串
a=["sad","happy","angry","happy"]
atv=TfidfVectorizer()
atv_fit=atv.fit_transform(a)
#下面这行代码是打印标签对应哪一列为1,这个TfidfVectorizer是按字母顺序排序的a-z。
print(atv.get_feature_names())
atv_fit.toarray()
结果: