Присвоение значений массиву с использованием индексов и субиндексов - PullRequest
2 голосов
/ 25 октября 2019

Это укусило меня несколько раз, и я не могу сказать, является ли это ошибкой или функцией.

nums = np.arange(10)
indx1 = np.array([2,4,6,8])
indx2 = np.array([0,3])

Похоже, я могу индексировать nums в любом случае

nums[indx1][indx2], nums[indx1[indx2]]

вывод (array([2, 8]), array([2, 8]))

Если я хочу переназначить эти значения, это не сработает

nums[indx1][indx2] = 20
nums

вывод array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

Но этоработает, как и ожидалось:

nums[indx1[indx2]] = 20
nums 

вывод array([ 0, 1, 20, 3, 4, 5, 6, 7, 20, 9])

Почему я должен вкладывать свои индексные массивы, а не в цепочку их?

1 Ответ

0 голосов
/ 25 октября 2019

Вот что я думаю.

Несмотря на то, что вышеупомянутые два метода возвращают одинаковые результаты, они различаются при выполнении операций присваивания.


nums[indx1][indx2] можно разделить на две части temp = nums[indx] и temp[indx2],

шаг 1. temp = nums[indx1] нарезка создаст новый возврат массива [2 4 6 8]

шаг 2. temp[indx2] вернет [2,8]

так что если вы попробуете nums[indx1][indx2] = 20, это эквивалентно

temp = nums[indx1]
print(temp)
temp[indx2] = 20
print(temp)

Это не повлияет на исходный массив nums. array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])


Почему второй методработа?

indx1[indx2] возврат [2, 8]

nums[[2,8]] = 20 даст вам array([ 0, 1, 20, 3, 4, 5, 6, 7, 20, 9]). Это работает, потому что вы присваиваете значение исходному массиву nums.

В целом, первый не может получить доступ к памяти nums, а второй делает.

...