Почему мы получаем такой результат для двойной логической индексации в Numpy? - PullRequest
0 голосов
/ 04 июля 2018

Я был удивлен результатом последнего выражения?

>>> from numpy import array, arange
>>> a = arange(12).reshape(3,4)
>>> b1 = array([False,True,True])             # first dim selection
>>> b2 = array([True,False,True,False])       # second dim selection
>>>
>>> a[b1,:]                                   # selecting rows
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>>
>>> a[b1]                                     # same thing
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>>
>>> a[:,b2]                                   # selecting columns
array([[ 0,  2],
       [ 4,  6],
       [ 8, 10]])
>>>
>>> a[b1,b2]                                  # a weird thing to do
array([ 4, 10])

Я ожидал:

array([[ 4,  6],
       [ 8, 10]])

У вас есть какое-либо объяснение, почему это так?

1 Ответ

0 голосов
/ 04 июля 2018

Давайте начнем с вашего массива:

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]

См. Также: связанный вопрос о том, почему этот метод не работает с логическими массивами.

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