Спрашиваю Тупи. Почему я могу получить такой результат?

#python #numpy

Вопрос:

Я читаю книгу «Введение в машинное обучение Python», и этот код находится на странице 69. Я не могу понять, почему я могу получить такой результат.

 X = np.array([[0, 1, 0, 1],
              [1, 0, 1, 1],
              [0, 0, 0, 1],
              [1, 0, 1, 0]])
y = np.array([0, 1, 0, 1])

for label in np.unique(y):
    print(X[y == label])
 

Результат:

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

Комментарии:

1. что вы ожидали получить?

Ответ №1:

Давайте разберем это по частям.

  1. np.unique(y)

    np.unique возвращает все уникальные элементы данного массива. В данном случае это так [0, 1] (поскольку в есть только два уникальных элемента y , 0 и 1).

    Так что беги

     for label in np.unique(y):
     

    будет повторяться дважды. В первый раз label будет равно 0 , и во второй раз будет равно 1 . Вы можете проверить это сами, запустив

     for label in np.unique(y):
        print(label)
     
  2. y == label

    Если вы запустите сравнение с массивом, numpy вернет логический массив того же размера. Таким образом, на первой итерации for цикла он будет запущен y == 0 , что дает нам [ True False True False] возможность , так как первый и третий элементы y равны 1. Затем на второй итерации он будет запущен y == 1 , давая нам обратную , [False True False True]

    Вы можете проверить это сами, запустив:

     for label in np.unique(y):
        print(y == label)
     
  3. X[y == label]

    Теперь, когда мы знаем, что делает остальная часть логики, последняя часть определяет, что происходит при передаче в y == label качестве «селектора» для элементов X . Когда вы передаете логический массив в качестве селектора, вы сообщаете numpy, какие элементы исходного массива вы хотите вернуть. В данном случае X это 2-мерный массив (размер 4×4), и если мы передадим массив длиной 4, мы сообщим numpy, какие строки мы хотим выбрать.

    Как упоминалось выше, на первой итерации y == label это [ True False True False] так , поэтому мы говорим, что нам нужны первая и третья строки X. Так print(X[y == label]) что дает

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

    А затем на второй итерации, в соответствии с вышеизложенным, y == label будут выбраны вторая и четвертая строки, дающие:

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

Надеюсь, это прояснит ситуацию!

Комментарии:

1. Хорошее объяснение!

2. #3 X[y == метка] С X[[Истинно, ложно, Истинно, ложно]] как вы можете получить первую и третью строки X. Вы можете объяснить?

3. Массив [True, False, True, False] выбирает, какие строки из X которых основаны на том, какие индексы являются истинными. Поскольку первый и третий элементы массива являются True (и другие являются False ), вы сообщаете numpy, что хотите выбрать первую и третью строки X . Так, например , если бы вы вместо этого вошли [False, False, True, False] , вы выбрали бы только третью строку X, так как только третий индекс True .