Numpy: Чем этот код отличается друг от друга? - PullRequest
0 голосов
/ 21 мая 2018

Пусть r будет массивом, где каждый элемент является индексом столбца (меньше чем N, размер r равен M), а P будет массивом M x N.

Следующие два фрагмента ведут себя по-разному.Почему?

1.

P[:, r] += 1

2.

for i in range(len(r)):
    P[i, r[i]] += 1

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Первый выбирает целый столбец для каждого элемента r.Второй просто стихия.Вы можете напрямую сравнить два случая следующим образом:

>>> P = np.arange(12).reshape(4, 3)
>>> r = np.random.randint(0, 3, (4,))
>>> r
array([1, 1, 2, 0])
>>> 
>>> P[:, r]
array([[ 1,  1,  2,  0],
       [ 4,  4,  5,  3],
       [ 7,  7,  8,  6],
       [10, 10, 11,  9]])
>>> P[np.arange(4), r]
array([1, 4, 8, 9])

Как вы можете видеть, второе дает по существу диагональ первого.

Вы можете получить прибыль, посмотрев в раздел «Объединение».расширенное и базовое индексирование »в документах numpy .

0 голосов
/ 21 мая 2018

P[:, r] в первом фрагменте выбирает всю первую ось (: здесь 0:-1) и r -ую вторую ось.

P[i, r[i]] в цикле for выбирает толькоi -я первая ось и r[i] -я вторая ось, которая является просто одним элементом.

Как только это ясно, неудивительно, что эти два дают разные результаты.

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