有關於獨熱編碼的介紹參考:這裏
下面列出如何使用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()函數互換使用。