【问题标题】:Create a 2D numpy array of one-hot vectors from a 1D array从一维数组创建一个由单热向量组成的二维 numpy 数组
【发布时间】:2021-05-20 05:48:09
【问题描述】:

我有一个 1D numpy 数组,我们称之为 labels。该数组的每个元素都是一个数字 (0...9)。我想将 labels 数组转换为 2D numpy 零数组,我们称之为 y_train。新的二维数组使得对于元素 labels[i]y_train 的第 ith 行在索引 label[i] 等于 1.0 。可以做到这一点的一种方法是遍历 labels 数组。见下文

>>> labels = [1, 5, 3, 9, 4]
>>> y_train = np.zeros((5, 10))
>>> for i in range(len(labels)):
        y_train[i][labels[i]] = 1.0
>>> y_train
array([[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.]])

这段代码 sn-p 描述了我想要实现的目标。 所以,我的主要问题是如何使用 numpy 对这个操作进行矢量化以加快计算速度?

【问题讨论】:

  • 虽然我怀疑这样做并不难,但有一个适用于 Keras 和 Scipy 的热门编码功能(以防万一也适用于您)。

标签: python numpy numpy-ndarray data-processing


【解决方案1】:

您可以简单地使用它来代替循环:

y_train[np.arange(len(labels)), labels] = 1

但我建议在 sklearn 或其他包中使用可用的库方法。

【讨论】:

  • 如果 y_train 的形状是 (5, 1, 10) 怎么办?那么我们将如何编辑代码呢?
  • 你可以这样做y_train[np.arange(len(labels)), :, labels] = 1。只需在该维度中添加:。由于它是单一维度,0 也可以代替:。如果您需要更一般的内容,您可能应该通过添加更多详细信息来编辑问题。
  • 如果你对这种索引不熟悉,可以看看here
猜你喜欢
  • 2023-01-04
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 2015-07-13
  • 2013-07-16
相关资源
最近更新 更多