python中的名义到双名义

时间:2015-02-19 09:17:15

标签: python numpy

要将任何字段转换为二项式,我们需要在特征向量(标题)中添加一些组件,这些组件等于该字段中可能值的数量。然后,如果数据点具有第i个值,则将第i个中的一个组件设置为1,将该属性的其余部分设置为0

e.g。考虑遵循数据集

array = np.array(['cat', 'dog', 'mouse', 'cat'])

我期待的结果是result = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 0, 0]])

提前谢谢。

3 个答案:

答案 0 :(得分:1)

建议的答案很好,但您也可以考虑使用pandas:

http://pandas.pydata.org/pandas-docs/version/0.13.1/generated/pandas.get_dummies.html

答案 1 :(得分:1)

三线。首先创建一个列表,将catdogmouse映射到一个数字,这是它们在列表中的位置,然后创建一个数组进行操作。最后使用列表推导来进行映射。

m = ['cat', 'dog', 'mouse']
x = np.array([1, 0, 0])
result = np.array([np.roll(x, m.index(value)) for value in array])

输出:

array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 1],
       [1, 0, 0]])

如果您想处理不在m中的值,则可以按如下方式修改列表推导:

arr = np.array(['cat', 'dog', 'mouse', 'cat', None, 'dog']) # Example array
result = np.array([np.roll(x, m.index(value)) if  value in m else np.zeros(len(m)) for value in arr])

输出:

array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  1.,  0.]])

答案 2 :(得分:0)

常见的python

def binom(arr):
    seen = set()
    values = []
    for item in arr:
        if item in seen:
            continue
        seen.add(item)
        values.append(item)

    result = []
    for item in arr:
        r = [0] * len(values)
        r[values.index(item)] = 1
        result.append(r)
    return result