объяснить код в Numpy, как это работает - PullRequest
0 голосов
/ 06 ноября 2019

это код, который я запускаю:

labels=[0,1,1,0,2,1,1,1,0,0]
labels_ = np.zeros((10, 3))
labels_

вышеприведенный код дает вывод:

array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

теперь, когда я бегу под кодом "блок 2"

labels_[np.arange(10), labels] = 1
labels_

это дает вывод:

array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 1., 0.],
       [1., 0., 0.],
       [0., 0., 1.],
       [0., 1., 0.],
       [0., 1., 0.],
       [0., 1., 0.],
       [1., 0., 0.],
       [1., 0., 0.]])

Может кто-нибудь объяснить, что происходит в коде "блок 2"?

1 Ответ

1 голос
/ 06 ноября 2019

Когда вы используете квадратные скобки для индексации массивов NumPy, первое число в скобках относится к строке, а второе число относится к столбцу - как игра линейных кораблей.

Теперь вы индексируетемассив нулей с именем labels_, использующий ваш список с именем labels, и массив, созданный с помощью np.arange:

labels_ = array([[0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.]]

labels = [0,1,1,0,2,1,1,1,0,0]

np.arange(10) = array([0,1,2,3,4,5,6,7,8,9])

Как мы уже говорили, индексирование NumPy выполняется [row,column], и вы используетеиндекс [np.arange(10), labels]. Когда вы даете NumPy несколько значений для индексации, он использует их по очереди, поэтому он ищет первое значение в массиве np.arange(10) и первый элемент в списке labels и использует их в качестве индекса строки и индекса столбца для нулей. массив, labels_.

Мы знаем, что первый элемент в np.arange(10) равен 0, а первый элемент в labels также равен 0, поэтому он выглядит в вашем списке labels_ для [0,0] - первый ряд и первый столбец. Вы сказали ему установить индексы в 1 с помощью = 1, поэтому он делает это.

Обратите внимание, что Python считает от 0, поэтому первая строка - это строка 0, вторая строка - это строка 1,третья строка - строка 2 и т. д. Также обратите внимание, что мы считаем первую строку как верхнюю строку, а первый столбец - как левый столбец.

Итак, теперь мы имеем:

labels_ = array([[1., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.]]

Далееон смотрит на второе значение в np.arange(10) и labels, и мы знаем, что np.arange(10)[1] = 1 и labels[1] = 1, поэтому он устанавливает строку 1 (вторая строка) и столбец 1 (второй столбец) в 1.

Итак, теперь у нас есть:

labels_ = array([[1., 0., 0.],
                 [0., 1., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.]]

Теперь мы ищем третий элемент в np.arange(10) и labels и получаем индекс [2,1], а это третий ряд и второй столбецмассив labels_, который мы установили в `:

labels_ = array([[1., 0., 0.],
                 [0., 1., 0.],
                 [0., 1., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.]]

Мы будем продолжать так до тех пор, пока у нас не закончатся числа в списках, которые мы используем для индексации.

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