Допустим, у меня есть 1d NumPy массив
a = array([1,0,3])
Я хотел бы закодировать это как 2d 1-горячий массив
b = array([[0,1,0,0], [1,0,0,0], [0,0,0,1]])
Есть ли быстрый способ сделать это? Быстрее, чем просто перебрать, a
чтобы установить элементы b
, то есть.
python
numpy
machine-learning
numpy-ndarray
one-hot-encoding
Джеймс Этвуд
источник
источник
b = np.zeros((a.size, a.max()+1))
обобщив:, тогда `b [np.arange (a.size), a] = 1`источник
values
следует использовать массив Numpy, а не список Python, тогда он работает во всех измерениях, а не только в 1D.np.max(values) + 1
как количество сегментов может быть нежелательно, если ваш набор данных, скажем, выбран случайным образом, и просто случайно он не может содержать максимальное значение. Количество сегментов должно быть скорее параметром, и может быть установлено утверждение / проверка, чтобы проверить, что каждое значение находится в пределах 0 (вкл.), И количество сегментов (исключая).numpy
документов): в каждом месте исходной матрицы (values
) у нас есть целое числоk
, и мы «помещаем» 1-горячий векторeye(n)[k]
в это место , Это добавляет измерение, потому что мы «помещаем» вектор в положение скаляра в исходной матрице.Если вы используете keras, для этого есть встроенная утилита:
И это в значительной степени совпадает с ответом @ YXD (см. Исходный код ).
источник
Вот что я считаю полезным:
Здесь
num_classes
обозначает количество классов, которые у вас есть. Так что если у вас естьa
вектор с формой (10000,), эта функция преобразует его в (10000, C) . Обратите внимание, что сa
нулевым индексом, т.е.one_hot(np.array([0, 1]), 2)
даст[[1, 0], [0, 1]]
.Именно то, что вы хотели иметь, я верю.
PS: источник модели Sequence - deeplearning.ai
источник
np.eye(num_classes)[a.reshape(-1)]. What you are simply doing is using
единичных горячих кодированных массивов с помощью np.eye` вы создаете диагональную матрицу с каждым индексом класса равным 1, остальному нулю, а затем с использованием предоставленных индексов путемa.reshape(-1)
получени выходной сигнал , соответствующий индексу вnp.eye()
. Я не понимал необходимости,np.sqeeze
поскольку мы используем его для простого удаления отдельных измерений, которых у нас никогда не будет, поскольку в измерении выходных данных всегда будет(a_flattened_size, num_classes)
Вы можете использовать
sklearn.preprocessing.LabelBinarizer
:Пример:
вывод:
Среди прочего, вы можете инициализировать
sklearn.preprocessing.LabelBinarizer()
так, чтобы вывод былtransform
редким.источник
Вы также можете использовать глаз функцию numpy:
numpy.eye(number of classes)[vector containing the labels]
источник
np.identity(num_classes)[indices]
лучше использовать. Хороший ответ!Вот функция, которая преобразует одномерный вектор в двумерный массив с одним горячим массивом.
Ниже приведен пример использования:
источник
assert
необходимости проверять векторную форму;)).assert ___
вif not ___ raise Exception(<Reason>)
.Для 1-горячего кодирования
Например
НАСЛАЖДАЙТЕСЬ КОДИРОВАНИЕМ
источник
>>> 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
Я думаю, что короткий ответ - нет. Для более общего случая в
n
измерениях я придумал это:Мне интересно, есть ли лучшее решение - мне не нравится, что я должен создать эти списки в последних двух строках. Во всяком случае, я провел некоторые измерения,
timeit
и кажется, чтоnumpy
-based (indices
/arange
) и итерационные версии работают примерно одинаково.источник
Просто, чтобы развить превосходный ответ от K3 --- rnc , вот более общая версия:
Кроме того , здесь быстрый и грязный тест этого метода и метода от принятого в настоящее время ответа по YXD (немного изменилась, так что они предлагают один и тот же API , кроме того , что последние работают только с 1D ndarrays):
Последний метод работает на ~ 35% быстрее (MacBook Pro 13 2015), но первый более общий:
источник
Вы можете использовать следующий код для преобразования в однократный вектор:
пусть x - вектор нормальных классов, имеющий один столбец с классами от 0 до некоторого числа:
если 0 не класс; затем удалите +1.
источник
Недавно я столкнулся с проблемой такого же рода и нашел упомянутое решение, которое оказалось удовлетворительным, если у вас есть числа, которые входят в определенную формацию. Например, если вы хотите выполнить горячее кодирование следующего списка:
продолжайте, опубликованные решения уже упоминались выше. Но что, если учесть эти данные:
Если вы сделаете это с помощью методов, упомянутых выше, у вас, скорее всего, будет 90 столбцов с одной горячей строкой. Это потому что все ответы включают что-то вроде
n = np.max(a)+1
. Я нашел более общее решение, которое сработало для меня, и хотел бы поделиться с вами:Я надеюсь, что кто-то сталкивался с такими же ограничениями на вышеуказанные решения, и это может пригодиться
источник
Такой тип кодирования обычно является частью массива numpy. Если вы используете такой массив:
тогда есть очень простой способ преобразовать это в 1-горячую кодировку
Вот и все.
источник
чистое и простое решение:
источник
Используя шаг конвейера Neuraxle :
Ссылка на документацию: neuraxle.steps.numpy.OneHotEncoder
источник
Вот пример функции, которую я написал, чтобы сделать это на основе ответов выше и моего собственного варианта использования:
источник
Я добавляю для завершения простую функцию, используя только пустые операторы:
В качестве входных данных он принимает матрицу вероятностей: например:
И это вернется
источник
Вот независимое от размерности автономное решение.
Это преобразует любой N-мерный массив
arr
неотрицательных целых чисел в однозначный N + 1-мерный массивone_hot
, гдеone_hot[i_1,...,i_N,c] = 1
означаетarr[i_1,...,i_N] = c
. Вы можете восстановить вход черезnp.argmax(one_hot, -1)
источник
Используйте следующий код. Это работает лучше всего.
Нашел здесь PS Вам не нужно заходить по ссылке.
источник