Проблема с вашим примером заключается в том, как вы определили a
и b
. Если бы вы распечатали x[a, b]
и x[mask]
, вы заметили бы, что 5-й и 6-й элементы на x[a, b]
будут переключаться с 5-м и 6-м значениями в x[mask]
. Причина этого в том, что вы устанавливаете каждое значение в mask
на True, используя a
и b
для индексации, поэтому порядок не имеет значения, но вы используете a
и b
для индексации x в своем утверждении так что порядок имеет значение там. Когда вы выполняете индексирование, numpy берет каждое значение из a
, чтобы получить соответствующую строку из вашей матрицы, и использует значение из того же индекса в b
, чтобы индексировать в эту строку. Чтобы проиллюстрировать использование массива 3x8:
a = [0, 1, 1, 1, 2, 2, 2]
b = [1, 0, 2, 4, 3, 1, 7]
x = [[1, 2, 3, 4, 5, 6, 7, 8],
[9, 10, 11, 12, 13, 14, 15, 16],
[17, 18, 19, 20, 21, 22, 23, 24]]
x[a, b] = [2, 9, 11, 13, 20, 18, 24]
mask[a, b] = [2, 9, 11, 13, 18, 20, 24]
Хороший способ исправить это - сначала определить a
и b
как список кортежей, отсортировать их сначала по их «a-значению», а затем по «b-значению» и использовать их из там. Таким образом, вы можете гарантировать заказ.