Katakanlah saya memiliki array numpy 1d
a = array([1,0,3])
Saya ingin menyandikan ini sebagai array 2d 1-hot
b = array([[0,1,0,0], [1,0,0,0], [0,0,0,1]])
Apakah ada cara cepat untuk melakukan ini? Lebih cepat daripada hanya mengulang a
untuk mengatur elemen b
, yaitu.
python
numpy
machine-learning
numpy-ndarray
one-hot-encoding
James Atwood
sumber
sumber
b = np.zeros((a.size, a.max()+1))
:, lalu `b [np.arange (a.size), a] = 1`sumber
values
haruslah array Numpy daripada daftar Python, kemudian bekerja di semua dimensi, tidak hanya dalam 1D.np.max(values) + 1
sebagai jumlah kotak mungkin tidak diinginkan jika kumpulan data Anda dikatakan sebagai sampel acak dan kebetulan itu mungkin tidak mengandung nilai maksimal. Jumlah ember harus lebih sebagai parameter dan pernyataan / pemeriksaan dapat dilakukan untuk memeriksa bahwa setiap nilai berada dalam 0 (incl) dan jumlah bucket (excl).numpy
dokumen): di setiap lokasi dalam matriks asli (values
), kami memiliki bilangan bulatk
, dan kami "meletakkan" vektor 1-panaseye(n)[k]
di lokasi itu . Ini menambahkan dimensi karena kita "meletakkan" vektor di lokasi skalar dalam matriks asli.Jika Anda menggunakan keras, ada utilitas bawaan untuk itu:
Dan itu hampir sama dengan jawaban @ YXD (lihat kode sumber ).
sumber
Inilah yang menurut saya berguna:
Di sini
num_classes
adalah singkatan dari jumlah kelas yang Anda miliki. Jadi, jika Anda memilikia
vektor dengan bentuk (10000,) fungsi ini mengubahnya menjadi (10000, C) . Perhatikan bahwaa
indeks-nol, yaituone_hot(np.array([0, 1]), 2)
akan memberi[[1, 0], [0, 1]]
.Persis seperti yang Anda inginkan, saya percaya.
PS: sumbernya adalah model Sequence - deeplearning.ai
sumber
np.eye(num_classes)[a.reshape(-1)]. What you are simply doing is using
np.eye` Anda membuat matriks diagonal dengan setiap indeks kelas sebagai 1 sisa nol dan kemudian menggunakan indeks yang disediakan dengana.reshape(-1)
menghasilkan output yang sesuai dengan indeks dalamnp.eye()
. Saya tidak mengerti kebutuhannp.sqeeze
karena kita menggunakannya untuk hanya menghapus dimensi tunggal yang tidak akan pernah kita miliki karena dalam dimensi output akan selalu(a_flattened_size, num_classes)
Anda bisa menggunakan
sklearn.preprocessing.LabelBinarizer
:Contoh:
keluaran:
Di antara hal-hal lain, Anda dapat menginisialisasi
sklearn.preprocessing.LabelBinarizer()
sehingga outputtransform
jarang.sumber
Anda juga dapat menggunakan fungsi mata numpy:
numpy.eye(number of classes)[vector containing the labels]
sumber
np.identity(num_classes)[indices]
mungkin lebih baik. Jawaban bagus!Berikut adalah fungsi yang mengubah vektor 1-D menjadi array panas satu-D.
Di bawah ini adalah beberapa contoh penggunaan:
sumber
assert
untuk memeriksa bentuk vektor;)).assert ___
menjadiif not ___ raise Exception(<Reason>)
.Untuk 1-hot-encoding
Sebagai contoh
NIKMATI CODING
sumber
>>> import numpy as np >>> import pandas >>> a = np.array([1,0,3]) >>> one_hot_encode=pandas.get_dummies(a) >>> print(one_hot_encode) 0 1 3 0 0 1 0 1 1 0 0 2 0 0 1 >>> print(one_hot_encode[1]) 0 1 1 0 2 0 Name: 1, dtype: uint8 >>> print(one_hot_encode[0]) 0 0 1 1 2 0 Name: 0, dtype: uint8 >>> print(one_hot_encode[3]) 0 0 1 0 2 1 Name: 3, dtype: uint8
Saya pikir jawaban singkatnya adalah tidak. Untuk kasus yang lebih umum dalam
n
dimensi, saya datang dengan ini:Saya bertanya-tanya apakah ada solusi yang lebih baik - saya tidak suka saya harus membuat daftar itu di dua baris terakhir. Lagi pula, saya melakukan beberapa pengukuran dengan
timeit
dan tampaknyanumpy
-based (indices
/arange
) dan versi iteratif melakukan hal yang sama.sumber
Hanya untuk menguraikan jawaban luar biasa dari K3 --- rnc , berikut adalah versi yang lebih umum:
Juga, berikut ini adalah tolok ukur cepat dan kotor dari metode ini dan metode dari jawaban yang saat ini diterima oleh YXD (sedikit berubah, sehingga mereka menawarkan API yang sama kecuali bahwa yang terakhir hanya berfungsi dengan ndarrays 1D):
Metode terakhir ~ 35% lebih cepat (MacBook Pro 13 2015), tetapi yang pertama lebih umum:
sumber
Anda dapat menggunakan kode berikut untuk mengkonversi menjadi vektor satu-panas:
misalkan x adalah vektor kelas normal yang memiliki satu kolom dengan kelas 0 ke beberapa nomor:
jika 0 bukan kelas; lalu hapus +1.
sumber
Saya baru-baru ini mengalami masalah yang sama dan menemukan solusi yang ternyata hanya memuaskan jika Anda memiliki angka yang masuk dalam formasi tertentu. Misalnya jika Anda ingin menyandiaksarakan satu daftar hot berikut:
Silakan, solusi yang diposting sudah disebutkan di atas. Tetapi bagaimana jika mempertimbangkan data ini:
Jika Anda melakukannya dengan metode yang disebutkan di atas, Anda kemungkinan akan berakhir dengan 90 kolom satu-panas. Ini karena semua jawaban mencakup sesuatu seperti
n = np.max(a)+1
. Saya menemukan solusi yang lebih umum yang berhasil untuk saya dan ingin berbagi dengan Anda:Saya harap seseorang menemukan batasan yang sama pada solusi di atas dan ini mungkin berguna
sumber
Jenis pengkodean seperti itu biasanya merupakan bagian dari numpy array. Jika Anda menggunakan array numpy seperti ini:
maka ada cara yang sangat sederhana untuk mengubahnya menjadi 1-hot encoding
Itu dia.
sumber
solusi bersih dan mudah:
sumber
Menggunakan langkah pipa Neuraxle :
Tautan ke dokumentasi: neuraxle.steps.numpy.OneHotEncoder
sumber
Berikut adalah contoh fungsi yang saya tulis untuk melakukan ini berdasarkan jawaban di atas dan kasus penggunaan saya sendiri:
sumber
Saya menambahkan untuk penyelesaian fungsi sederhana, hanya menggunakan operator numpy:
Diperlukan sebagai input matriks probabilitas: misalnya:
Dan itu akan kembali
sumber
Inilah solusi mandiri dimensi-independen.
Ini akan mengkonversi array N-dimensi
arr
dari bilangan bulat negatif ke array N + 1-dimensi satu-panasone_hot
, di manaone_hot[i_1,...,i_N,c] = 1
artinyaarr[i_1,...,i_N] = c
. Anda dapat memulihkan input melaluinp.argmax(one_hot, -1)
sumber
Gunakan kode berikut. Ini bekerja paling baik.
Ditemukan di sini PS Anda tidak perlu masuk ke tautan.
sumber