#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:
Давайте разберем это по частям.
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)
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)
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
.