Маскировка нескольких строк массива и восстановление - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть маска с mask_re:(8781288, 1), включая единицы и нули, label file (y_lbl: (8781288, 1)) и вектор объектов с feat_re: (8781288, 64).Мне нужно взять только те строки из вектора объектов и файлов меток, которые равны 1 в файле маски.Как я могу это сделать, и как можно применить противоположное действие, чтобы поместить (восстановить обратно) значения прогноза (ypred) в masked_label file на основе файла маски в элементах, которые являются одним?

Например, в Matlab можно легко сделать X=feat_re(mask_re==1) и восстановить обратно new_lbl(mask_re==1)=ypred, где new_lbl=zeros(8781288, 1).Я пытался сделать подобное в python:

 X=feat_re[np.where(mask_re==1),:]
 X.shape
(2, 437561, 64)

РЕДАКТИРОВАНИЕ (РЕШЕНО) В соответствии с тем, что @hpaulj предложил

Проблема была с формой моей маскифайл, как только я изменил его на mask_new=mask_re.reshape((8781288)), он решил мою проблему, а затем

X=feat_re[mask_new==1,:]
(437561, 64)

Ответы [ 2 ]

1 голос
/ 24 сентября 2019
In [182]: arr = np.arange(12).reshape(3,4)                                      
In [183]: mask = np.array([1,0,1], bool)                                        
In [184]: arr[mask,:]                                                           
Out[184]: 
array([[ 0,  1,  2,  3],
       [ 8,  9, 10, 11]])
In [185]: new = np.zeros_like(arr)                                              
In [186]: new[mask,:] = np.array([10,12,14,16])                                 
In [187]: new                                                                   
Out[187]: 
array([[10, 12, 14, 16],
       [ 0,  0,  0,  0],
       [10, 12, 14, 16]])

Я подозреваю, что ваша ошибка связана с формой mask:

In [188]: mask1 = mask[:,None]                                                  
In [189]: mask1.shape                                                           
Out[189]: (3, 1)
In [190]: arr[mask1,:]                                                          
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-190-6317c3ea0302> in <module>
----> 1 arr[mask1,:]

IndexError: too many indices for array

Помните, что numpy может иметь массивы 1d и 0d;это не заставляет все быть 2d.

с where (он же nonzero):

In [191]: np.nonzero(mask)                                                      
Out[191]: (array([0, 2]),)     # 1 element tuple
In [192]: np.nonzero(mask1)                                                     
Out[192]: (array([0, 2]), array([0, 0]))    # 2 element tuple
In [193]: arr[_191]            # using the mask index                                                  
Out[193]: 
array([[ 0,  1,  2,  3],
       [ 8,  9, 10, 11]])
0 голосов
/ 24 сентября 2019

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

X = feat_re[mask_re==1, :]
X = X.reshape(2, -1, 64)

, это выбирает строки feat_re, где (mask_re == 1) - True.Затем вы можете изменить форму x, используя функцию изменения формы.Вы можете снова использовать Reshape, чтобы вернуться к той же форме массива.«-1» при изменении формы означает, что размер должен быть рассчитан по numpy

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