Неожиданное поведение при индексировании 2D np.array с двумя булевыми массивами

two_d = np.array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24]]) first = np.array((True, True, False, False, False)) second = np.array((False, False, False, True, True)) 

Теперь, когда я вхожу:

 two_d[first, second] 

Я получил:

 array([3,9]) 

что не имеет для меня большого смысла. Может ли кто-нибудь объяснить это просто?

2 Solutions collect form web for “Неожиданное поведение при индексировании 2D np.array с двумя булевыми массивами”

При задании нескольких булевых массивов для индексирования NumPy объединяет индексы значений True. Первое истинное значение в first в сочетании с первым истинным значением во second и т. Д. Затем NumPy извлекает элементы в каждом из этих (x, y) индексов.

Это означает, что two_d[first, second] эквивалентен:

 two_d[[0, 1], [3, 4]] 

Другими словами, вы извлекаете значения по индексу (0, 3) и индексу (1, 4); 3 и 9 . Обратите внимание, что если два массива имеют разные значения истинных значений, ошибка будет повышена!

В документах по расширенной индексации кратко упоминается это поведение и предлагается np.ix_ как «менее удивительная» альтернатива:

Объединение нескольких булевых индексирующих массивов или булевых с целым индексирующим массивом лучше всего понять с obj.nonzero() аналогии obj.nonzero() . Функция ix_ также поддерживает логические массивы и будет работать без каких-либо неожиданностей.

Следовательно, вы можете искать:

 >>> two_d[np.ix_(first, second)] array([[3, 4], [8, 9]]) 

Проверьте документацию на логическую индексацию .

two_d[first, second] – это то же самое, что и
two_d[first.nonzero(), second.nonzero()] , где:

 >>> first.nonzero() (array([0, 1]),) >>> second.nonzero() (array([3, 4]),) 

Используемые в качестве индексов, это будет выбирать 3 и 9, потому что

 >>> two_d[0,3] 3 >>> two_d[1,4] 9 

а также

 >>> two_d[[0,1],[3,4]] array([3, 9]) 

Также связаны с mildy: индексирование NumPy с помощью List?

Python - лучший язык программирования в мире.