Вернуть матрицу, применив логическую маску (логическую матрицу того же размера) в python - PullRequest
0 голосов
/ 24 апреля 2020

Я сгенерировал квадратную матрицу размера 4 и логическую матрицу одинакового размера с помощью:

import numpy as np

A = np.random.randn(4,4)
B = np.full((4,4), True, dtype = bool)
B[[0],:] = False
B[:,[0]] = False

Следующий код возвращает две матрицы размера 4, A имеет все случайные числа, а B имеет все логические операторы, где первая строка и столбец заголовка ложные True (элементы в B == True). Есть ли какой-либо логический оператор в numpy для выполнения этой операции? или мне нужно go через каждый элемент A и B и сравнить их, а затем присвоить его новой матрице?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Если вы хотите удалить какие-либо строки / столбцы, в которых есть хотя бы элемент False, вы можете использовать np.any, чтобы найти такие строки и столбцы, а затем использовать np.ix_, чтобы создать 2D-массив из строки / индексы col:

A=A[np.ix_(*np.where(np.any(B, axis=0)), *np.where(np.any(B, axis=1)))]

Это даст вам вывод для любого массива 2D numpy и той же логической маски / условия той же формы. Вы можете расширить это до любого размера numpy массив, добавив измерения в скобках.

образец A:

[[-0.36027839 -1.54588632  0.1607951   1.68865218]
 [ 0.20959185  0.13962857  1.97189081 -0.7686762 ]
 [ 0.03868048 -0.36612182  0.77802273  0.23195807]
 [-1.26148984  0.44672696  0.45970364 -1.58457129]]

Маскированный A с B:

[[ 0.13962857  1.97189081 -0.7686762 ]
 [-0.36612182  0.77802273  0.23195807]
 [ 0.44672696  0.45970364 -1.58457129]]
0 голосов
/ 24 апреля 2020
In [214]: A = np.random.randn(4,4) 
     ...: B = np.full((4,4), True, dtype = bool) 
     ...: B[[0],:] = False 
     ...: B[:,[0]] = False                                                                             
In [215]: A                                                                                            
Out[215]: 
array([[-0.80676817, -0.20810386,  1.28448594, -0.52667651],
       [ 0.6292733 , -0.05575997,  0.32466482, -0.23495175],
       [-0.70896794, -1.60571282, -1.43718839, -0.42032337],
       [ 0.01541418, -2.00072652, -1.54197002,  1.2626283 ]])
In [216]: B                                                                                            
Out[216]: 
array([[False, False, False, False],
       [False,  True,  True,  True],
       [False,  True,  True,  True],
       [False,  True,  True,  True]])

Логическое индексирование (с массивом соответствующего размера) всегда создает массив 1d. В этом случае он не выбрал никаких значений для A[0,:]:

In [217]: A[B]                                                                                         
Out[217]: 
array([-0.05575997,  0.32466482, -0.23495175, -1.60571282, -1.43718839,
       -0.42032337, -2.00072652, -1.54197002,  1.2626283 ])

Но поскольку все остальные 3 строки имеют 3 True, изменение формы результата дает разумный результат:

In [218]: A[B].reshape(3,3)                                                                            
Out[218]: 
array([[-0.05575997,  0.32466482, -0.23495175],
       [-1.60571282, -1.43718839, -0.42032337],
       [-2.00072652, -1.54197002,  1.2626283 ]])

То, имеет ли смысл изменение формы, зависит от общего числа элементов и вашей собственной интерпретации данных.

...