给定一个一维下标数组:

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

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

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

当前回答

这种类型的编码通常是numpy数组的一部分。如果你使用numpy数组,像这样:

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

然后有一个非常简单的方法将其转换为1-hot编码

out = (np.arange(4) == a[:,None]).astype(np.float32)

就是这样。

其他回答

使用下面的代码。这样效果最好。

def one_hot_encode(x):
"""
    argument
        - x: a list of labels
    return
        - one hot encoding matrix (number of labels, number of class)
"""
encoded = np.zeros((len(x), 10))

for idx, val in enumerate(x):
    encoded[idx][val] = 1

return encoded

在这里找到了p.s.你不需要进入链接。

以下是我认为有用的方法:

def one_hot(a, num_classes):
  return np.squeeze(np.eye(num_classes)[a.reshape(-1)])

这里num_classes表示您拥有的类的数量。如果你有一个形状为(10000,)的向量,这个函数将它转换为(10000,C)注意,a是零索引,即one_hot(np。数组([0,1]),2)将给出[[1,0],[0,1]]。

我相信这正是你想要的。

PS:源代码是Sequence models - deeplearning.ai

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

from keras.utils.np_utils import to_categorical   

categorical_labels = to_categorical(int_labels, num_classes=3)

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

你也可以使用numpy的eye函数:

numpy。眼(类数)[包含标签的向量]

我认为简短的答案是否定的。对于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的(索引/范围)和迭代版本的表现是一样的。