Индексирование NumPy ndarray с NumPy ndarray - PullRequest
0 голосов
/ 30 апреля 2018

Я делаю урок с набором данных радужной оболочки. В этом процессе я нашел фрагмент кода, который я не могу понять:

Он состоит из двух ndarrays:

iris.target_names - нудистый символ с метками целевой переменной:

iris.target_names
>>> array(['setosa', 'versicolor', 'virginica'], dtype='<U10')

clf.predict(test[features]) - нудистый ндаррэй с закодированным цифровым символом моих предсказаний:

clf.predict(test[features])
>>> array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
   1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2],
  dtype=int64)

Следующий код создает помеченный ndarray для моих предсказаний:

iris.target_names[clf.predict(test[features])]
>>> array(['setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 
'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 
'setosa', 'setosa', 'versicolor', 'versicolor', 'versicolor', 'versicolor',  
'versicolor', 'versicolor', (...), dtype='<U10')

Я думал об этом некоторое время, но я не понимаю, как это работает. Потому что на самом деле мы индексируем одномерный массив с тремя элементами с помощью одномерного массива с более чем тремя элементами, верно? Как это может работать?

Было бы замечательно, если бы кто-то мог помочь мне с некоторыми подсказками по этой теме.

Спасибо, Маркус

1 Ответ

0 голосов
/ 30 апреля 2018

Если мы просто проигнорируем весь аспект машинного обучения и перейдем к упрощенному примеру:

In[6]:
# our classes
classes=np.array(['a','b','c'])
# generate some random labels
predict= np.random.randint(0,3,10)
predict
Out[6]: array([0, 2, 1, 0, 2, 0, 1, 2, 1, 0])

Теперь, если мы передадим массив predict в качестве маски на classes, мы переведем 0,1,2 в порядковую позицию в массиве:

In[7]
classes[predict]
Out[7]: 
array(['a', 'c', 'b', 'a', 'c', 'a', 'b', 'c', 'b', 'a'], 
      dtype='<U1')

Здесь нет ничего волшебного, когда вы видите этот простой пример

Вы можете увидеть это также в меньшем массиве:

In[8]:
classes[[1,0,2]]

Out[8]: 
array(['b', 'a', 'c'], 
      dtype='<U1')

Таким образом, в действительности предсказанные классы индексируются обратно в классы по позиции

Длина переданного массива здесь не имеет значения, все, что вы делаете - это предоставляете индексированные значения массиву, чтобы он создавал новый массив переданной длины, содержащий значения по этому индексу:

In[9]:
classes[[0,0,0,0]]

Out[9]: 
array(['a', 'a', 'a', 'a'], 
      dtype='<U1')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...