如何将one-hot编码转换为整数?

时间:2017-02-27 22:58:55

标签: python numpy tensorflow

我有一个带有形状(100,10)的numpy数组。每行都是一个热门编码。我想将它转换为具有形状(100,)的nd数组,以便将每个向量行转换为表示非零索引的索引的整数。是否有使用numpy或tensorflow的快速方法?

7 个答案:

答案 0 :(得分:23)

您可以使用numpy.argmaxtf.argmax。例如:

import numpy as np  
a  = np.array([[0,1,0,0],[1,0,0,0],[0,0,0,1]])
print('np.argmax(a, axis=1): {0}'.format(np.argmax(a, axis=1)))

输出:

np.argmax(a, axis=1): [1 0 3]

您可能还想查看sklearn.preprocessing.LabelBinarizer.inverse_transform

答案 1 :(得分:12)

正如Frank Demoncourt所指出的那样,由于one_hot只有一个1,其余为零,所以你可以使用argmax作为这个特例。一般来说,如果你想在一个numpy数组中找到一个值,你可能会想咨询numpy.where。此外,这个堆栈交换问题:

Is there a NumPy function to return the first index of something in an array?

由于单热矢量是一个全0和1的矢量,你可以这样做:

>>> import numpy as np
>>> a = np.array([[0,1,0,0],[1,0,0,0],[0,0,0,1]])
>>> [np.where(r==1)[0][0] for r in a]
[1, 0, 3]

这只是构建索引列表,每行为1。 [0] [0]索引只是为了抛弃np.where返回的结构(带有数组的元组),这比你要求的要多。

对于任何特定的行,您只想索引到一个。例如,在第0行中,在索引1中找到1。

>>> np.where(a[0]==1)[0][0]
1

答案 2 :(得分:4)

只需使用np.argmax(x, axis=1)

示例:

import numpy as np
array = np.array([[0, 1, 0, 0], [0, 0, 0, 1]])
print(np.argmax(array, axis=1))
> [1 3]

答案 3 :(得分:0)

虽然我强烈建议使用numpy来提高速度,但是mpu.ml.one_hot2indices(one_hots)展示了如何在不使用numpy的情况下做到这一点。只需pip install mpu --user --upgrade

那你就可以做

>>> one_hot2indices([[1, 0], [1, 0], [0, 1]])
[0, 0, 1]

答案 4 :(得分:0)

def int_to_onehot(n, n_classes):
    v = [0] * n_classes
    v[n] = 1
    return v

def onehot_to_int(v):
    return v.index(1)


>>> v = int_to_onehot(2, 5)
>>> v
[0, 0, 1, 0, 0]


>>> i = onehot_to_int(v)
>>> i
2

答案 5 :(得分:0)

您可以使用以下简单代码:

a=[[0,0,0,0,0,1,0,0,0,0]]
j=0
for i in a[0]:
    if i==1:
        print(j)
    else:
        j+=1

5

答案 6 :(得分:0)

在这些情况下,我所做的就是这样。这个想法是将单热向量解释为1,2,3,4,5 ...数组的索引。

# Define stuff
import numpy as np
one_hots = np.zeros([100,10])
for k in range(100):
    one_hots[k,:] = np.random.permutation([1,0,0,0,0,0,0,0,0,0])

# Finally, the trick
ramp = np.tile(np.arange(0,10),[100,1])
integers = ramp[one_hots==1].ravel()

我喜欢这个技巧,因为我觉得np.argmax和其他建议的解决方案可能比索引慢(尽管索引可能会消耗更多的内存)