Numpy自己实现独热编码one-hot

有关于独热编码的介绍参考:这里

下面列出如何使用numpy自己实现独热编码:

import numpy as np

def dense_to_onehot(labels_dense, num_classes=10):
    num_labels = labels_dense.shape[0]
    index_offset = np.arange(num_labels) * num_classes
    labels_onehot = np.zeros((num_labels,num_classes))
    # 展平的索引值对应相加,然后得到精确索引并修改labels_onehot中的每一个值
    labels_onehot.flat[index_offset + labels_dense.ravel()] = 1
    print(labels_onehot)

# 模拟需要做独热编码的数据,这是10个类别的数据,从0-9
labels_dense = np.arange(start=0,stop=10,step=1,dtype=np.uint8)

print(labels_dense)
dense_to_onehot(labels_dense)
'''
[0 1 2 3 4 5 6 7 8 9]
[[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]
'''

在上面的代码里面我们用到了flat和ravel两个函数,关于矩阵压平我们可以有如下方法可以选择:

numpy中的ravel()、flat()、flatten()、squeeze()、reshape()都有将多维数组转换为一维数组的功能,区别: 
ravel():如果没有必要,不会产生源数据的副本,指向同样的数据空间 
flatten():返回源数据的副本 ,新的内存空间

flat:返回一个迭代器对象,通过该对象和索引拿到对应展平为一维的值,并支持修改
squeeze():只能对维数为1的维度降维

另外,reshape(-1)也可以“拉平”多维数组

经过上面的区别,所以在上述代码实现中,可以将ravel()和flatten()函数互换使用。

你可能感兴趣的:(Numpy)