单热编码和现有数据

时间:2017-10-12 12:43:01

标签: numpy tensorflow one-hot-encoding

我有一个numpy数组(N,M),其中一些列应该是单热编码的。请使用numpy和/或tensorflow帮助进行单热编码。

示例:

[
[ 0.993, 0, 0.88 ]
[ 0.234, 1, 1.00 ]
[ 0.235, 2, 1.01 ]
.....
]

这里的第二列(值为3和2)应该是一个热编码,我知道只有3个不同的值(0,1,2)。

结果数组应如下所示:

[
[ 0.993, 0.88, 0, 0, 0 ]
[ 0.234, 1.00, 0, 1, 0 ]
[ 0.235, 1.01, 1, 0, 0 ]
.....
]

就像我能够将这个数组输入张量流一样。 请注意第二列已删除,并且每个子数组的末尾附加了一个热门版本。

任何帮助都将受到高度赞赏。 提前谢谢。

更新

以下是我现在所拥有的: 嗯,不完全是...... 1.我在阵列中有超过3列......但我仍然只想用第二列来做... 2.第一阵列是结构化的,即它的形状是(N,)

这就是我所拥有的:

def one_hot(value, max_value):
    value = int(value)
    a = np.zeros(max_value, 'uint8')
    if value != 0:
        a[value] = 1
    return a

# data is structured array with the shape of (N,)
# it has strings, ints, floats inside..
# was get by np.genfromtxt(dtype=None)

unique_values = dict()
unique_values['categorical1'] = 1
unique_values['categorical2'] = 2
for row in data:
   row[col] = unique_values[row[col]]

codes = np.zeros((data.shape[0], len(unique_values)))

idx = 0
for row in data:
   codes[idx] = one_hot(row[col], len(unique_values))  # could be optimised by not creating new array every time
   idx += 1

data = np.c_[data[:, [range(0, col), range(col + 1, 32)]], codes[data[:, col].astype(int)]]

还试图通过以下方式连接:

print data.shape # shape (5000,)
print codes.shape # shape (5000,3)
data = np.concatenate((data, codes), axis=1)

1 个答案:

答案 0 :(得分:0)

这是一种方法 -

In [384]: a # input array
Out[384]: 
array([[ 0.993,  0.   ,  0.88 ],
       [ 0.234,  1.   ,  1.   ],
       [ 0.235,  2.   ,  1.01 ]])

In [385]: codes = np.array([[0,0,0],[0,1,0],[1,0,0]]) # define codes here

In [387]: codes
Out[387]: 
array([[0, 0, 0],   # encoding for 0
       [0, 1, 0],   # encoding for 1
       [1, 0, 0]])  # encoding for 2

# Slice out the second column and append one-hot encoded array
In [386]: np.c_[a[:,[0,2]], codes[a[:,1].astype(int)]]
Out[386]: 
array([[ 0.993,  0.88 ,  0.   ,  0.   ,  0.   ],
       [ 0.234,  1.   ,  0.   ,  1.   ,  0.   ],
       [ 0.235,  1.01 ,  1.   ,  0.   ,  0.   ]])