我有一个标签名称列表,我已经提到并创建了一个字典:
my_list = [b'airplane',
b'automobile',
b'bird',
b'cat',
b'deer',
b'dog',
b'frog',
b'horse',
b'ship',
b'truck']
label_dict =dict(enumerate(my_list))
{0: b'airplane',
1: b'automobile',
2: b'bird',
3: b'cat',
4: b'deer',
5: b'dog',
6: b'frog',
7: b'horse',
8: b'ship',
9: b'truck'}
现在,我正在尝试清除map
/ apply
dict值到我的目标,这是一个热门编码的形式。
y_test[0]
array([ 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.])
y_test[0].map(label_dict) should return:
'cat'
我正在玩
(lambda key,value: value for y_test[0] == 1)
但无法提出任何具体的
谢谢。
答案 0 :(得分:3)
由于我们正在处理one-hot encoded
数组,因此可以使用argmax
为每行获取一个关闭1
的索引。因此,使用列表作为输入 -
[my_list[i] for i in y_test.argmax(1)]
或者np.take
有数组输出 -
np.take(my_list,y_test.argmax(1))
要使用dict
并假设顺序键为0,1,..
,我们可以 -
np.take(label_dict.values(),y_test.argmax(1))
如果按键基本上不按序列排序 -
np.take(label_dict.values(), np.searchsorted(label_dict.keys(),y_test.argmax(1)))
示例运行 -
In [79]: my_list
Out[79]:
['airplane',
'automobile',
'bird',
'cat',
'deer',
'dog',
'frog',
'horse',
'ship',
'truck']
In [80]: y_test
Out[80]:
array([[ 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.]])
In [81]: [my_list[i] for i in y_test.argmax(1)]
Out[81]: ['cat', 'automobile', 'ship']
In [82]: np.take(my_list,y_test.argmax(1))
Out[82]:
array(['cat', 'automobile', 'ship'],
dtype='|S10')
答案 1 :(得分:3)
我们可以使用点积来反转单热编码,如果它真的是 ONE -hot。
让我们从列表分解
开始f, u = pd.factorize(my_list)
现在,如果你有一个数组,你想用
取回你的字符串a = np.array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0])
然后使用dot
a.dot(u)
'cat'
现在假设
y_test = np.array([
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
])
然后
y_test.dot(u)
array(['cat', 'automobile', 'ship'], dtype=object)
如果它不是一热的,而是多热的,你可以加入逗号
y_test = np.array([
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 1, 0, 0, 0, 0, 0, 1, 0]
])
[', '.join(u[y.astype(bool)]) for y in y_test]
['cat', 'automobile, truck', 'bird, ship']