给定一个一维下标数组:

a = array([1, 0, 3])

我想把它编码成一个2D数组:

b = array([[0,1,0,0], [1,0,0,0], [0,0,0,1]])

当前回答

如果你正在使用keras,有一个内置的实用程序:

from keras.utils.np_utils import to_categorical   

categorical_labels = to_categorical(int_labels, num_classes=3)

它与@YXD的答案几乎相同(请参阅源代码)。

其他回答

创建一个有足够列的零数组b,即a.max() + 1。 然后,对于每一行i,设置第a[i]列为1。

>>> a = np.array([1, 0, 3])
>>> b = np.zeros((a.size, a.max() + 1))
>>> b[np.arange(a.size), a] = 1

>>> b
array([[ 0.,  1.,  0.,  0.],
       [ 1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.]])

我最近遇到了一个类似的问题,发现只有当你的数字符合特定的形式时,答案才令人满意。例如,如果你想单热编码以下列表:

all_good_list = [0,1,2,3,4]

继续吧,上面已经提到了发布的解决方案。但如果考虑到这些数据:

problematic_list = [0,23,12,89,10]

如果使用上面提到的方法,最后可能会得到90个单一热列。这是因为所有答案都包含n = np.max(a)+1。我找到了一个更通用的解决方案,想和你们分享:

import numpy as np
import sklearn
sklb = sklearn.preprocessing.LabelBinarizer()
a = np.asarray([1,2,44,3,2])
n = np.unique(a)
sklb.fit(n)
b = sklb.transform(a)

我希望有人遇到上述解决方案的相同限制,这可能会派上用场

我认为简短的答案是否定的。对于n维的更一般的情况,我想到了这个:

# For 2-dimensional data, 4 values
a = np.array([[0, 1, 2], [3, 2, 1]])
z = np.zeros(list(a.shape) + [4])
z[list(np.indices(z.shape[:-1])) + [a]] = 1

我想知道是否有更好的解决方案——我不喜欢我必须在最后两行创建这些列表。不管怎样,我用timeit做了一些测量,似乎基于numpy的(索引/范围)和迭代版本的表现是一样的。

对于1-hot-encoding

   one_hot_encode=pandas.get_dummies(array)

例如

享受编码

我添加了一个简单的补全函数,只使用numpy操作符:

   def probs_to_onehot(output_probabilities):
        argmax_indices_array = np.argmax(output_probabilities, axis=1)
        onehot_output_array = np.eye(np.unique(argmax_indices_array).shape[0])[argmax_indices_array.reshape(-1)]
        return onehot_output_array

它以一个概率矩阵作为输入:例如:

[[0.03038822 0.65810204 0.16549407 0.3797123] . [0.02771272 0.2760752 0.3280924 0.33458805]

它会返回

[[0 0 0 0]... [0 0 0 1]