Как обнулить все индексы массива с помощью np.infs с помощью логического массива? - PullRequest
0 голосов
/ 08 января 2019

У меня есть матрица со значениями inf и логический массив, который указывает, какие значения сохранить. Как я могу использовать логический массив для обнуления всех значений в исходной матрице, включая инфы, но чтобы все инфы соответствовали истинам?

ех

X     = [inf, 1, inf]
        [inf, 2,   4]
        [3,   4,   5]

M     = [1,   0,   0]
        [0,   1,   0]
        [0,   1,   0]

(current output)
M * X = [inf, 0, nan]
        [nan, 2,   0]
        [0,   4,   0]

(desired output)
M * X = [inf, 0,   0]
        [0,   2,   0]
        [0,   4,   0]

1 Ответ

0 голосов
/ 08 января 2019

Входы

In [77]: X    
Out[77]: 
array([[inf,  1., inf],
       [inf,  2.,  4.],
       [ 3.,  4.,  5.]])

In [78]: M 
Out[78]: 
array([[1, 0, 0],
       [0, 1, 0],
       [0, 1, 0]])

подход

Сначала нам нужно инвертировать маску M, а затем получить индексы, используя numpy.where; С помощью этих индексов мы можем затем установить элементы в исходном массиве на ноль, проиндексировав их следующим образом:

# inverting the mask
In [59]: M_not = np.logical_not(M)

In [80]: M_not
Out[80]: 
array([[False,  True,  True],
       [ True, False,  True],
       [ True, False,  True]])

# get the indices where `True` exists in array `M_not`
In [81]: indices = np.where(M_not) 

In [82]: indices 
Out[82]: (array([0, 0, 1, 1, 2, 2]), array([1, 2, 0, 2, 0, 2]))

# zero out the elements
In [84]: X[indices] = 0

In [61]: X 
Out[61]: 
array([[inf, 0., 0.],
       [0., 2., 0.],
       [0., 4., 0.]])

P.S. инвертирование маска не должна пониматься как инверсия матрицы. Это следует понимать как переключение логических значений (True -> False; False -> True)

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