Давайте начнем с вашего массива:
a = np.array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
Ваша текущая логика индексации соответствует следующему:
a[[1, 2], [0, 2]] # array([ 4, 10])
Придерживаясь двух измерений, NumPy интерпретирует это как индексирование dim1-индексов [1, 2]
и dim2-индексов [0, 2]
или координат (1, 0)
и (2, 2)
. Здесь не участвуют трансляции.
Чтобы разрешить вещание с логическими массивами, вы можете использовать numpy.ix_
:
res = a[np.ix_(b1, b2)]
print(res)
array([[ 4, 6],
[ 8, 10]])
Магия, которую выполняет ix_
, отмечена в документах : «Булевы последовательности будут интерпретироваться как булевы маски для соответствующего измерения (эквивалентно передаче в np.nonzero(boolean_sequence)
).»
print(np.ix_(b1, b2))
(array([[1],
[2]], dtype=int64), array([[0, 2]], dtype=int64))
В качестве примечания вы можете использовать более прямой подход, если у вас есть целочисленные индексы:
b1 = np.array([1, 2])
b2 = np.array([0, 2])
a[b1[:, None], b2]
См. Также: связанный вопрос о том, почему этот метод не работает с логическими массивами.