给定一个一维下标数组:

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

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

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

当前回答

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

其他回答

>>> values = [1, 0, 3]
>>> n_values = np.max(values) + 1
>>> np.eye(n_values)[values]
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的答案几乎相同(请参阅源代码)。

你可以使用下面的代码转换成一个热向量:

设x是普通的类向量,它只有一个列,从0到某个数:

import numpy as np
np.eye(x.max()+1)[x]

如果0不是一个类;然后移除+1。

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

如果使用tensorflow,则存在one_hot():

import tensorflow as tf
import numpy as np

a = np.array([1, 0, 3])
depth = 4
b = tf.one_hot(a, depth)
# <tf.Tensor: shape=(3, 3), dtype=float32, numpy=
# array([[0., 1., 0.],
#        [1., 0., 0.],
#        [0., 0., 0.]], dtype=float32)>