Получение сетки матрицы с помощью логической индексации в 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
после выполнения среза.