Numpy 1热arrays

比方说,我有一个1D numpy数组

a = [1,0,3] 

我想将其编码为2d 1热门arrays

 b = [[0,1,0,0], [1,0,0,0], [0,0,0,1]] 

有一个快速的方法来做到这一点? 比循环更快速地设置b元素,也就是说。

你的数组a定义了输出数组中非零元素的列。 您还需要定义行,然后使用奇特的索引:

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

这只是为了说明。 你可能想要为bselect一个更合适的np.bool ,比如np.bool

 >>> 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.]]) 

你可以使用sklearn.preprocessing.LabelBinarizer

例:

 import sklearn.preprocessing a = [1,0,3] label_binarizer = sklearn.preprocessing.LabelBinarizer() label_binarizer.fit(range(max(a)+1)) b = label_binarizer.transform(a) print('{0}'.format(b)) 

输出:

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

除此之外,您可以初始化sklearn.preprocessing.LabelBinarizer()以便transform的输出是稀疏的。

这是一个将一维向量转换为一维二维向量数组的函数。

 #!/usr/bin/env python import numpy as np def convertToOneHot(vector, num_classes=None): """ Converts an input 1-D vector of integers into an output 2-D array of one-hot vectors, where an i'th input value of j will set a '1' in the i'th row, j'th column of the output array. Example: v = np.array((1, 0, 4)) one_hot_v = convertToOneHot(v) print one_hot_v [[0 1 0 0 0] [1 0 0 0 0] [0 0 0 0 1]] """ assert isinstance(vector, np.ndarray) assert len(vector) > 0 if num_classes is None: num_classes = np.max(vector)+1 else: assert num_classes > 0 assert num_classes >= np.max(vector) result = np.zeros(shape=(len(vector), num_classes)) result[np.arange(len(vector)), vector] = 1 return result.astype(int) 

以下是一些示例用法:

 >>> a = np.array([1, 0, 3]) >>> convertToOneHot(a) array([[0, 1, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1]]) >>> convertToOneHot(a, num_classes=10) array([[0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]]) 

我认为简短的答案是否定的。 对于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 

我想知道是否有更好的解决scheme – 我不喜欢我必须在最后两行创build这些列表。 无论如何,我用timeit做了一些测量,似乎numpyindices / arange )和迭代版本的performancearange