【问题标题】:How can I create a label encoder utilizing only numpy (and not sklearn LabelEncoder)?如何仅使用 numpy(而不是 sklearn LabelEncoder)创建标签编码器?
【发布时间】:2020-07-12 06:22:59
【问题描述】:

我正在尝试重新创建类似于 sklearn.preprocessing.LabelEncoder

但是我不想使用sklearn 或pandas。我只想使用numpy 和 Python 标准库。这是我想要实现的目标:

import numpy as np
input = np.array([['hi', 'there'],
                     ['scott', 'james'],
                     ['hi', 'scott'],
                     ['please', 'there']])

# Output would look like
np.ndarray([[0, 0],
            [1, 1],
            [0, 2],
            [2, 0]])

能够将其映射回来也很棒,因此结果将再次与输入完全相同。

如果这是在电子表格中,输入将如下所示:

【问题讨论】:

  • 这是什么逻辑?为什么“那里”映射到 0?
  • 你为什么要这样做?
  • @Simon - 我正在减少对 sklearn 的依赖
  • @DaniMesejo - 我在那里打错字了。现在应该很好了。逻辑是我“按列”这样做
  • 标签的顺序是否重要,或者标签对值来说是唯一的?

标签: python pandas numpy scikit-learn


【解决方案1】:

这是一个简单的理解,使用来自np.unique 的return_inverse 结果

arr = np.array([['hi', 'there'], ['scott', 'james'],
                ['hi', 'scott'], ['please', 'there']])

np.column_stack([np.unique(arr[:, i], return_inverse=True)[1] for i in range(arr.shape[1])])

array([[0, 2],
       [2, 0],
       [0, 1],
       [1, 2]], dtype=int64)

或沿轴应用:

np.column_stack(np.apply_along_axis(np.unique, 0, arr, return_inverse=True)[1])

【讨论】:

  • 这非常接近,但是,输出数组不太准确,因为它混合了列之间的唯一性。
  • @ScottStoltzman 抱歉,您是什么意思?您需要单独映射每列的值,还是需要映射每个值而不管它属于哪个唯一标识符?给定您预期的输出,这似乎是您想要的(每列单独的唯一映射),除非我遗漏了什么?这些数字只是不同,因为np.unique 排序,所以标签是按字母顺序排列的,而不是按出现次数。
  • 是的,每列分开。当前的解决方案解决了整个数组,我希望它按列(轴 = 1 种事物)
  • @ScottStoltzman 不,它不是因为列表理解单独获取每一列。 AFAIK,np.unique 没有默认参数来作用于轴中的单个值。您可以找到 uniue 值,或每个轴的唯一事物(即在 2D 数组中唯一的行或唯一的列)。我会用np.apply_along_axis添加一个解决方案,但这并没有什么不同
  • 你完全正确,第一个答案是正确的!很抱歉误读了。
【解决方案2】:

正在与@Scott Stoltzmann 交谈,并吐槽了一种扭转已接受答案的方法。

您可以在整个程序中随身携带原始的arr,也可以记录每一列的映射。如果你做后者,这里有一些简单的非性能代码:

l = []

for real_column, encoded_column in zip(np.column_stack(arr), np.column_stack(arr2)):    
    d = {}
    for real_element, encoded_element in zip(real_column, encoded_column):
        d[encoded_element] = real_element
    l.append(d)
print(l)

使用上述方法执行此操作:

[{0: 'hi', 2: 'scott', 1: 'please'}, {2: '那里', 0: 'james', 1: 'scott'}]

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 2018-08-02
    • 2020-12-22
    • 2016-11-20
    • 2018-12-20
    • 1970-01-01
    • 2020-03-04
    • 2017-03-27
    • 1970-01-01
    相关资源
    最近更新 更多