【问题标题】:Numpy one hot encoder is only displaying huge arrays with zerosNumpy one hot encoder 只显示带有零的巨大数组
【发布时间】:2017-01-28 12:12:43
【问题描述】:

我有一个 (400, 1) numpy 数组,其中包含 4300, 4450, 4650... 等值,其中这些值可以分布在 20 个类中,即 4300 class 1, 4450 class 2... 并尝试使用以下代码将该数组转换为一个热编码列表。 y_train_onehot 显示了 400 个数组的列表,其中每个数组的大小 > 4000,即每个数组有大约 4000 个零。我该如何解决这个问题,以便为每个值创建一个热编码向量,即 4300 可以是 00001。

def convertOneHot(data):
    y=np.array([int(i[0]) for i in data])
    y_onehot=[0]*len(y)
    for i,j in enumerate(y):
        y_onehot[i]=[0]*(y.max() + 1)
        y_onehot[i][j]=1
    return (y,y_onehot)

y_train,y_train_onehot = convertOneHot(data)

【问题讨论】:

  • 能否添加一个最小代表性样本并解释预期结果?
  • @Divakar 我刚刚上传了一张截图

标签: python numpy


【解决方案1】:

以下是一些未优化的示例:

def convert_to_one_hot(y):
  levels=np.unique(y)
  n_classes=levels.shape[0]
  one_hot=np.zeros((y.shape[0],n_classes),"uint8")
  for i in xrange(y.shape[0]):
    for index,level in enumerate(levels):
      if  y[i]==level:
        one_hot[i,index]=1
  return one_hot

EDIT 1 一个可读性较差但更优雅的版本:

def convert_to_one_hot2(y):
  levels=np.unique(y)
  one_hot=(y==levels).astype("uint8")
  return one_hot 

【讨论】:

    【解决方案2】:

    我用过 Pandas Dummies,非常简单。

    >>> import pandas as pd
    >>> s = pd.Series(y_train)
    

    然后

    y_train_onehot = pd.get_dummies(s)
    

    【讨论】:

      猜你喜欢
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 2021-05-01
      • 2020-02-12
      • 2017-02-16
      • 1970-01-01
      相关资源
      最近更新 更多