NumpyOne热编码器只显示带有零的巨大数组

2024-06-01 02:27:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个(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)

sample from y_train_onehot


Tags: 代码innumpy编码列表fordatadef
2条回答

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

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

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

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

我用了熊猫假人,很简单。你知道吗

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

然后呢

y_train_onehot = pd.get_dummies(s)

hot_encode

相关问题 更多 >