【问题标题】:Vectorize 2D character array column-wise按列向量化 2D 字符数组
【发布时间】:2019-04-08 02:22:23
【问题描述】:

我有一个 2D numpy 数组,如下所示:

a=np.array([["Science", "Blue", 3],
            ["Math", "Red", 4],
            ["Math", "Red", 5],
            ["Science", "Red", 3]])

并且我需要将其按列转换为数值,如下所示(所需的输出):

out=np.array([[0, 0, 0],
              [1, 1, 1],
              [1, 1, 2], 
              [0, 1, 0]])

但是,为了下游的可解释性,我还需要一个输出来从数值追溯到原始值。我在想这样的事情:

trace_back_dict = {0: {0: "Science", 1: "Math"}, 
                   1: {0: "Blue", 1: "Red"}, 
                   2: {0: 3, 1: 4, 2: 5}}

外部键是原始数组中的列索引,内部字典给出 numeric: 字符值的映射。

有没有一种简单的方法可以做到这一点,最好是sklearn 风格的东西,我可以在其中做一个fit_transform,然后是transform(用于训练和测试集目的)?

我正在查看sklearnLabelEncoder,基本上我需要在每一列上应用不同的。有关如何有效地做到这一点的任何建议?

谢谢!

杰克

【问题讨论】:

  • 你真的关心科学 = 0 和数学 = 1,或者任何这样的映射是否有效?
  • @DSM 任何此类映射都可以使用。这只是一个示例,这些不是我正在使用的实际数据:)

标签: python numpy scikit-learn


【解决方案1】:

你可以使用OrdinalEncoder:

In [25]: a = [['Science', 'Blue', 3], ['Math', 'Red', 4], ['Math', 'Red', 5], ['Science', 'Red', 3]]

In [26]: enc = sklearn.preprocessing.OrdinalEncoder()

In [27]: enc.fit(a)
Out[27]: OrdinalEncoder(categories='auto', dtype=<class 'numpy.float64'>)

In [28]: enc.transform(a)
Out[28]: 
array([[1., 0., 0.],
       [0., 1., 1.],
       [0., 1., 2.],
       [1., 1., 0.]])

In [29]: enc.categories_
Out[29]: 
[array(['Math', 'Science'], dtype=object),
 array(['Blue', 'Red'], dtype=object),
 array([3, 4, 5], dtype=object)]

In [30]: trace_back_dict = {i: dict(enumerate(v)) for i, v in enumerate(enc.categories_)}

In [31]: trace_back_dict
Out[31]: {0: {0: 'Math', 1: 'Science'}, 1: {0: 'Blue', 1: 'Red'}, 2: {0: 3, 1: 4, 2: 5}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2014-07-19
    • 2022-07-23
    • 2019-09-11
    • 2020-09-07
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多