在François Chollet的Python深度学习中,出现了以下函数:
def vectorize_sequences(sequences, dimension=10000):
results = np.zeros((len(sequences), dimension))
for i, sequence in enumerate(sequences):
results[i, sequence] = 1.
return results
我理解这个函数的作用。这个函数在这个问题和这个问题中都被问到了,在这里,这里,这里&在这里尽管传播如此广泛,但根据Chollet的书,这种矢量化是"完成"的;手动以获得最大清晰度"我感兴趣的是是否有一个标准,而不是";手动";
是否有一个与上述函数行为非常相似的函数的标准Keras/Tensorflow/Scikit-learn/Pandas/Numpy实现
带MultiLabelBinarizer
的解决方案
假设sequences
是最大可能值为dimension-1
的整数数组,我们可以使用sklearn.preprocessing
中的MultiLabelBinarizer
来复制函数vectorize_sequences
的行为
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer(classes=range(dimension))
mlb.fit_transform(sequences)
使用numpy播放的解决方案
假设sequences
是最大可能值达到dimension-1
的整数数组
(np.array(sequences)[:, :, None] == range(dimension)).any(1).view('i1')
计算示例
>>> sequences
[[4, 1, 0],
[4, 0, 3],
[3, 4, 2]]
>>> dimension = 10
>>> mlb = MultiLabelBinarizer(classes=range(dimension))
>>> mlb.fit_transform(sequences)
array([[1, 1, 0, 0, 1, 0, 0, 0, 0, 0],
[1, 0, 0, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0, 0, 0, 0, 0]])
>>> (np.array(sequences)[:, :, None] == range(dimension)).any(1).view('i1')
array([[0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
[1, 0, 1, 0, 1, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 1, 0, 0, 0, 0, 0]])