Как создать маску с одним по указанному индексу? - PullRequest
0 голосов
/ 08 апреля 2019

Я изучаю Python, NumPy и машинное обучение.Я пытаюсь настроить нейронную сеть с нуля, и у меня возникла проблема.

У меня есть несколько выводов, например [[2], [4], [1]], и я пытаюсь создать для нее маску, которая будет выглядеть следующим образом

[
[0 0 1 0 0]
[0 0 0 0 1]
[0 1 0 0 0] 
]

сейчас я использую следующий код:

tmpY = np.array(Y)
tmp = np.zeros([m, 10])
for i in range (0, m):
    index = tmpY[i][0]
    tmp[i][index] = 1

Но я думаю, что есть более чистый путь.

Редактировать:

Спасибо, ребята, за вашу помощь.Я думаю, что нашел решение, которое будет работать лучше всего для меня

C = np.array([[0], [2], [4], [2], [4], [1] ,[3], [8], [5], [3], [1], [2]])
np.eye(C.shape[0], np.amax(C) + 1, dtype=int)[C.flatten()]

[[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 1 0 0 0 0 0 0]
 [0 0 0 0 1 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 0 0 0 1]
 [0 0 0 0 0 1 0 0 0]
 [0 0 0 1 0 0 0 0 0]
 [0 1 0 0 0 0 0 0 0]
 [0 0 1 0 0 0 0 0 0]]

Я оставлю это здесь на случай, если кто-то еще будет смотреть его.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

ваше решение верное, это просто более чистая версия

indices = [[2],[4],[1]]
mask = np.zeros((m,10),dtype=np.uint8)

for i,indices in enumerate(indices): mask[i,indices] = 1

не уверен, откуда вы взяли этот массив indices, но у вас есть какое-то условие, по которому вы хотите замаскировать оригиналВы можете сделать:

original = np.random.uniform((100,100))

mask = np.zeros(original.shape,dtype=np.uint8)
mask[condition(original)] = 1 # eg mask[original < 0.5] = 1
0 голосов
/ 08 апреля 2019

sklearn имеет класс, который может помочь вам сделать это. Вы можете использовать OneHotEncoder для создания маски согласно документации

В вашем примере

from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(handle_unknown='ignore')
X = [[2], [4], [1]]
enc.fit(X)

Тогда вывод выглядит так:

enc.transform(X).toarray()
array([[0., 1., 0.],
       [0., 0., 1.],
       [1., 0., 0.]])

EDIT: Вы заметите, что вывод имеет 3 элемента для каждой преобразованной записи; это связано с тем, что категория 3 не отображается в данных, которые мы используем для соответствия OneHotEncoder

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...