我有一个长度为n的numpy数组y,其整数范围为[0 ... k-1]。由此,我想创建一个n-by-k numpy矩阵M,其中如果y [i] == j,则M [i,j]为1,并且0为其他。
在numpy中执行此操作的最佳方法是什么?
答案 0 :(得分:3)
使用广播:
a = np.array([1, 2, 3, 1, 2, 2, 3, 0])
m = a[:, None] == np.arange(max(a)+1)
结果是:
array([[False, True, False, False],
[False, False, True, False],
[False, False, False, True],
[False, True, False, False],
[False, False, True, False],
[False, False, True, False],
[False, False, False, True],
[ True, False, False, False]], dtype=bool)
或者创建一个零数组并填充,我认为它更快:
m2 = np.zeros((len(a), a.max()+1), np.bool)
m2[np.arange(len(a)), a] = True
print m2
答案 1 :(得分:0)
这可能有点像,但它是一个非常可扩展的解决方案,至少值得注意。如果您已经拥有scikit-learn,则DictVectorizer
类用于将数据集中的分类要素转换为按列描述的列式二进制表示形式:
import numpy as np
from sklearn.feature_extraction import DictVectorizer
# starting with your numpy array
y = np.array([1, 2, 3, 1, 2, 2, 3, 0])
# transform the array to a list of dicts, with original
# int values now as strings, and a throw-away key ''
y_dict = [{'':str(x)} for x in y.tolist()]
# create the vectorizer and transform the list of dicts
vec = DictVectorizer(sparse=False, dtype=int)
M = vec.fit_transform(y_dict)
print M
[[0 1 0 0]
[0 0 1 0]
[0 0 0 1]
[0 1 0 0]
[0 0 1 0]
[0 0 1 0]
[0 0 0 1]
[1 0 0 0]]
再一次,可能有点矫枉过正,但它有点可爱,我想我会把它扔出去。