我知道那里有次优的解决方案,但是我正在尝试优化我的代码。到目前为止,我发现的最短方法是:
import numpy as np
from sklearn.preprocessing import OrdinalEncoder
target = np.array(['dog', 'dog', 'cat', 'cat', 'cat', 'dog', 'dog', 'cat', 'cat'])
oe = OrdinalEncoder()
target = oe.fit_transform(target.reshape(-1, 1)).ravel()
target = np.eye(np.unique(target).shape[0])[np.array(target, dtype=np.int32)]
print(target)
[[0。 1.]
[0。 1.]
[1。 0.]
[1。 0.]
...
这是丑陋的代码,而且很长。删除其中的任何部分,将无法正常工作。我正在寻找一种更简单的方法,该方法不会涉及从两个不同的库调用六个以上的函数。
答案 0 :(得分:0)
知道了。这将适用于任意数量的唯一值数组。
import numpy as np
target = np.array(['dog', 'dog', 'cat', 'cat', 'cat', 'dog', 'dog',
'cat', 'cat', 'hamster', 'hamster'])
def one_hot(array):
unique, inverse = np.unique(array, return_inverse=True)
onehot = np.eye(unique.shape[0])[inverse]
return onehot
print(one_hot(target))
出[9]:
[[0.,1.,0.],
[0.,1.,0.],
[1.,0.,0.],
[1.,0.,0.],
[1.,0.,0.],
[0.,1.,0.],
[0.,1.,0.],
[1.,0.,0.],
[1.,0.,0.],
[0.,0.,1.],
[0.,0.,1。]])
答案 1 :(得分:-1)
为什么不使用OneHotEncoder?
>>> from sklearn.preprocessing import OneHotEncoder
>>> ohe = OneHotEncoder(categories='auto', sparse=False)
>>> arr = ohe.fit_transform(target[:, np.newaxis])
>>> arr
array([[0., 1.],
[0., 1.],
[1., 0.],
[1., 0.],
[1., 0.],
[0., 1.],
[0., 1.],
[1., 0.],
[1., 0.]])
它存储有关转换的漂亮的元数据:
>>> ohe.categories_
[array(['cat', 'dog'], dtype='<U3')]
另外,您可以轻松地转换回来:
>>> ohe.inverse_transform(arr).ravel()
array(['dog', 'dog', 'cat', 'cat', 'cat', 'dog', 'dog', 'cat', 'cat'],
dtype='<U3')
答案 2 :(得分:-1)
您可以使用keras和LabelEncoder
import numpy as np
from keras.utils import to_categorical
from sklearn.preprocessing import LabelEncoder
# define example
data = np.array(['dog', 'dog', 'cat', 'cat', 'cat', 'dog', 'dog', 'cat', 'cat'])
label_encoder = LabelEncoder()
data = label_encoder.fit_transform(data)
# one hot encode
encoded = to_categorical(data)