屏蔽出numpy数组的一些行并恢复b

2024-10-01 11:25:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含1和0的mask_re:(8781288, 1)掩码,label file(y\ulbl:(8781288,1))和一个包含feat_re: (8781288, 64)的特征向量。我只需要从特征向量和标签文件中获取掩码文件中为1的那些行。我如何做到这一点,以及如何基于一个元素中的掩码文件在masked_label file中应用相反的操作,即将预测值(ypred)放入(恢复回来)

例如,在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)

Tags: 文件re元素newmask标签labelfile
2条回答

您可以使用布尔索引进行掩蔽,如下所示

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

这将选择(mask\u re==1)为真的专长行。然后您可以使用重塑函数重塑x。您可以再次使用“重塑”恢复到相同的阵列形状。“-1英寸表示需要通过numpy计算尺寸

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数组;它并不强迫一切都是二维的

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]])

相关问题 更多 >