【问题标题】:How to convert 2D numpy array to One Hot Encoding?如何将 2D numpy 数组转换为 One Hot Encoding?
【发布时间】:2020-02-12 20:24:22
【问题描述】:

我试图对以下数据应用一种热编码。但我对输出感到困惑。在应用一种热编码之前,数据的形状是 (5,10),在应用一种热编码之后,数据的形状是 (5,20)。但是每个字母都会被编码为一个 4 元素。因此,在应用一种热编码后,形状应该是 (5, 40) 而不是 (5,10)。我该如何解决这个问题?

X = [[‘A’, ‘G’, ‘T’, ‘G’, ‘T’, ‘C’, ‘T’, ‘A’, ‘A’, ‘C’],
     [‘A’, ‘G’, ‘T’, ‘G’, ‘T’, ‘C’, ‘T’, ‘A’, ‘A’, ‘C’],
     [‘G’, ‘C’, ‘C’, ‘A’, ‘C’, ‘T’, ‘C’, ‘G’, ‘G’, ‘T’],
     [‘G’, ‘C’, ‘C’, ‘A’, ‘C’, ‘T’, ‘C’, ‘G’, ‘G’, ‘T’],
     [‘G’, ‘C’, ‘C’, ‘A’, ‘C’, ‘T’, ‘C’, ‘G’, ‘G’, ‘T’]]
Y = np.array(X)
print('Shape of numpy array', Y.shape)

# one hot encoding

onehot_encoder = OneHotEncoder(sparse=False)
onehot_encoded = onehot_encoder.fit_transform(Y)
print(onehot_encoded)
print('Shape of one hot encoding', onehot_encoded.shape)


Output:

Shape of numpy array (5, 10)
[[1. 0. 0. 1. 0. 1. 0. 1. 0. 1. 1. 0. 0. 1. 1. 0. 1. 0. 1. 0.]
 [1. 0. 0. 1. 0. 1. 0. 1. 0. 1. 1. 0. 0. 1. 1. 0. 1. 0. 1. 0.]
 [0. 1. 1. 0. 1. 0. 1. 0. 1. 0. 0. 1. 1. 0. 0. 1. 0. 1. 0. 1.]
 [0. 1. 1. 0. 1. 0. 1. 0. 1. 0. 0. 1. 1. 0. 0. 1. 0. 1. 0. 1.]
 [0. 1. 1. 0. 1. 0. 1. 0. 1. 0. 0. 1. 1. 0. 0. 1. 0. 1. 0. 1.]]
 Shape of one hot encoding (5, 20)

【问题讨论】:

  • 我不确定输出应该是 (5,40)。您有 5 个示例,每个示例由 10 个字母组成。如果每个字母变成 4 个值的列表,那么您将有 10 个 4 值列表的 5 个示例。那将是一个 (5, 10, 4) 数组(即三维)

标签: python scikit-learn numpy-ndarray one-hot-encoding


【解决方案1】:

您需要单独对每一列进行一次热编码,以便为您的 ndarray 中的每一列获得 4 个新列:

X = np.array(X)

# Get unique classes.
classes = np.unique(X)

# Replace classes with itegers.
X = np.searchsorted(classes, X)

# Get an identity matrix.
eye = np.eye(classes.shape[0])

# Iterate over all columns
# and get one-hot encoding for each column.
X = np.concatenate([eye[i] for i in X.T], axis=1)

X.shape
# (5, 40)

考虑以下示例:

[['A', 'G'],
 ['C', 'C'],
 ['T', 'A']]

您将在 one-hot 编码的 ndarray 中获得 8 (2 x 4) 列:

  Column 0      Column 1         
 A  C  G  T    A  C  G  T

 1  0  0  0    0  0  1  0
 0  1  0  0    0  1  0  0
 0  0  0  1    1  0  0  0

【讨论】:

  • 谢谢。有用。但我有点困惑。你能解释一下为什么输出中 G 和 T 的值相似吗?如果我考虑 A=[1. 0. 0. 0.],G=[0. 1. 0. 0.], C=[0. 0. 1. 0.],T=[0. 0. 0. 1.] 输出应为 [1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 0. 0. 1. 1. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0.] 对于 ['A' 'G' 'T' 'G' 'T' 'C' ' T' 'A' 'A' 'C'] 但它显示:[1. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 1. 0. 0. 0. 1. 0. 0. 0. 1. 0. 1. 0. 0. 0. 0. 0. 1. 1. 0. 0. 0. 1. 0. 0. 0. 0. 1. 0. 0.]
  • @TanzilaIslamMohita 我添加了一个示例。喜欢的可以采纳我的回答。
  • 现在,我明白了。谢谢。
  • 如果序列是 [['A', 'G'], ['C', 'N'], ['T', 'A']], 'N' 是缺失值。是否可以使用这种方法将“N”替换为 0 0 0 0? ['C', 'N'] => [0 1 0 0 0 0 0 0] 的输出将如下所示
猜你喜欢
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 2012-06-08
  • 2023-03-13
  • 2013-06-30
  • 2021-11-02
  • 2023-03-17
相关资源
最近更新 更多