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.]]) >>>
这只是为了说明。 你可能想要为b
select一个更合适的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
做了一些测量,似乎numpy
( indices
/ arange
)和迭代版本的performancearange
。