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()函數互換使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章