Python: 如何将字符串数组转换为因子列表

Python: how to convert a string array to a factor list

Python 2.7、numpy,以因子列表的形式创建水平

我有一个列出自变量的数据文件,最后一列表示 class。例如:

2.34,4.23,0.001, ... ,56.44,2.0,"cloudy with a chance of rain"

使用 numpy,我将所有数字列读入一个矩阵,并将最后一列读入一个我称之为 "classes" 的数组。事实上,我事先并不知道 class 个名字,所以我不想使用字典。我也不想使用 Pandas。这是问题的示例:

classes = ['a', 'b', 'c', 'c', 'b', 'a', 'a', 'd']
type (classes)
<type 'list'>
classes = numpy.array(classes)
type(classes)
<type 'numpy.ndarray'>
classes
array(['a', 'b', 'c', 'c', 'b', 'a', 'a', 'd'],
      dtype='|S1')
# requirements call for a list like this:
# [0, 1, 2, 2, 1, 0, 3]

请注意,目标 class 可能非常稀疏,例如 'z',在 100,000 个案例中可能只有 1 个。另请注意,classes 可能是任意文本字符串,例如科学名称。

我正在使用 Python 2.7 和 numpy,但我受困于我的环境。此外,数据已经过预处理,所以它被缩放并且所有值都是有效的 - 我不想第二次预处理数据以提取唯一的 classes 并在处理数据之前构建字典。我真正想要的是 Python 相当于 R 中的 stringAsFactors 参数,当脚本读取数据时,它会自动将字符串向量转换为因子向量。

不要问我为什么使用 Python 而不是 R - 我照我说的做。

谢谢,抄送。

您可以将 np.uniquereturn_inverse=True 一起使用到 return 唯一的 class 名称和一组相应的整数索引:

import numpy as np

classes = np.array(['a', 'b', 'c', 'c', 'b', 'a', 'a', 'd'])

classnames, indices = np.unique(classes, return_inverse=True)

print(classnames)
# ['a' 'b' 'c' 'd']

print(indices)
# [0 1 2 2 1 0 0 3]

print(classnames[indices])
# ['a' 'b' 'c' 'c' 'b' 'a' 'a' 'd']

class 个名称将按词汇顺序排序。