Написание эффективного кода для применения обратной операции с использованием масок в NumPy - PullRequest
1 голос
/ 15 апреля 2020

Во-первых, у меня есть сжатый numpy массив c и маска m, которая использовалась для генерации c из полного массива a.

Я хочу вывести восстановленный массив b той же формы, что и исходный массив a, но с результатами сжатого массива. Следующий код работает для этого, но я не знаю, как сделать его эффективным. Любые рекомендации будут оценены

import numpy as np
a = np.asarray((1, 2, 3, 4, 5, 6, 7, 8, 9))
m = np.array((True,True,True,True,False,False,True,True,True))
c = np.ma.compressed(np.ma.masked_where(m==False, a))

i=0
j=0
b = np.zeros(a.size)
while (i<a.size):
    if (m[i] == True):
        b[i] = c[j]
        j = j+1
    i = i+1
b

, что приводит к:

array([1., 2., 3., 4., 0., 0., 7., 8., 9.])

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Вы можете использовать логическое индексирование:

b = np.zeros_like(m, dtype=float) # change dtype to `int` if that's what you want.

b[m] = c

Вывод

array([1., 2., 3., 4., 0., 0., 7., 8., 9.])
1 голос
/ 15 апреля 2020

Можете ли вы просто попробовать,

b = a*m

Это должно дать вам желаемый результат.

...