代码之家  ›  专栏  ›  技术社区  ›  Jack Arnestad

按列矢量化二维字符数组

  •  2
  • Jack Arnestad  · 技术社区  · 7 年前

    我有一个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:character值的映射。

    sklearn 风格,我可以做一个 fit_transform transform

    我在看 sklearn公司 LabelEncoder ,基本上我需要的是在每一列上应用一个不同的。对如何有效地做到这一点有什么建议吗?

    杰克

    1 回复  |  直到 7 年前
        1
  •  6
  •   DSM    7 年前

    你可以用一个 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}}