Получение сетки матрицы с помощью логической индексации в Numpy

Я пытаюсь переписать функцию, используя numpy, которая изначально была в MATLAB. В MATLAB есть логическая часть индексации:

X = reshape(1:16, 4, 4).';
idx = [true, false, false, true];
X(idx, idx)

ans =

     1     4
    13    16

Когда я пытаюсь сделать это просто, я не могу получить правильную индексацию:

X = np.arange(1, 17).reshape(4, 4)
idx = [True, False, False, True] 
X[idx, idx]
# Output: array([6, 1, 1, 6])

Как правильно получить сетку из матрицы с помощью логической индексации?

3 ответа

Решение

Вы также можете написать:

>>> X[np.ix_(idx,idx)]
array([[ 1,  4],
       [13, 16]])
In [1]: X = np.arange(1, 17).reshape(4, 4)

In [2]: idx = np.array([True, False, False, True])  # note that here idx has to
                                                    # be an array (not a list)
                                                    # or boolean values will be 
                                                    # interpreted as integers

In [3]: X[idx][:,idx]
Out[3]: 
array([[ 1,  4],
       [13, 16]])

В numpy это называется fancy indexing, Чтобы получить предметы, которые вы хотите, вы должны использовать 2D массив индексов.

Вы можете использовать outer сделать из вашего 1D idx правильный 2D массив индексов. Нарушители, применительно к двум 1D последовательности, сравните каждый элемент одной последовательности с каждым элементом другого. Напоминая что True*True=True а также False*True=False, np.multiply.outer(), который так же, как np.outer()может дать вам 2D индексы:

idx_2D = np.outer(idx,idx)
#array([[ True, False, False,  True],
#       [False, False, False, False],
#       [False, False, False, False],
#       [ True, False, False,  True]], dtype=bool)

Который вы можете использовать:

x[ idx_2D ]
array([ 1,  4, 13, 16])

В вашем реальном коде вы можете использовать x=[np.outer(idx,idx)] но это не экономит память, работая так же, как если бы вы включили del idx_2D после выполнения среза.

Другие вопросы по тегам