2017-08-18 82 views
1

我有存在如2- d numpy的陣列(布爾陣列)布爾掩碼刪除所有元素在對應於布爾陣列掩模

array([[ True, True, True, True, True, True, True], 
     [ True, True, True, True, True, True, True], 
     [ True, True, True, True, True, True, True], 
     [ True, True, True, True, True, True, True], 
     [False, False, False, False, False, False, False], 
     [False, False, False, False, False, False, False], 
     [False, False, False, False, False, False, False]], dtype=bool) 

我也有值的獨立的2 d numpy的陣列,其是相同的尺寸布爾掩碼(值陣列)

array([[ 19.189 , 23.2535, 23.1555, 23.4655, 22.6795, 20.3295, 19.7005], 
     [ 20.688 , 20.537 , 23.8465, 21.2265, 24.5805, 25.842 , 23.198 ], 
     [ 22.418 , 21.0115, 21.0355, 20.217 , 24.1275, 24.4595, 21.981 ], 
     [ 21.156 , 18.6195, 23.299 , 22.5535, 23.2305, 28.749 , 21.0245], 
     [ 21.7495, 19.614 , 20.3025, 21.706 , 22.853 , 19.623 , 16.7415], 
     [ 20.9715, 21.9505, 21.1895, 21.471 , 21.0445, 21.096 , 19.3295], 
     [ 24.3815, 26.2095, 25.3595, 22.9985, 21.586 , 23.796 , 20.375 ]]) 

的我想要做的是刪除值的陣列,其中在該布爾區域相同的位置等於False所有元素。是否有捷徑可尋?

這個例子的期望的輸出是:

array([[ 19.189 , 23.2535, 23.1555, 23.4655, 22.6795, 20.3295, 19.7005], 
     [ 20.688 , 20.537 , 23.8465, 21.2265, 24.5805, 25.842 , 23.198 ], 
     [ 22.418 , 21.0115, 21.0355, 20.217 , 24.1275, 24.4595, 21.981 ], 
     [ 21.156 , 18.6195, 23.299 , 22.5535, 23.2305, 28.749 , 21.0245]]) 

在這個特定的示例中,在布爾數組的末尾存在所有False值,但是這並非總是如此,它們可以是隨機分散式。因此,我需要在相應的屏蔽值布爾陣列

+1

整行是True還是False?或者會有混合? –

+2

如果我的回答可以幫助,你可以[標記它接受(https://stackoverflow.com/help/someone-answers)或告訴我什麼是錯的,所以我可以修復它。 –

+0

'arr [mask]'做出這樣的選擇。結果將是1d,因爲通常這種掩碼可以選擇每行不同數量的值。在某些情況下,您可能會將結果重塑爲有意義的二維數組。 – hpaulj

回答

2

在大多數情況下,你可以簡單地創建一個MaskedArray它的行爲就好像這些被「刪除」,也能夠在保持維度的從列/行「刪除」單元素相同:

import numpy as np 
arr = np.array([[ 19.189 , 23.2535, 23.1555, 23.4655, 22.6795, 20.3295, 19.7005], 
       [ 20.688 , 20.537 , 23.8465, 21.2265, 24.5805, 25.842 , 23.198 ], 
       [ 22.418 , 21.0115, 21.0355, 20.217 , 24.1275, 24.4595, 21.981 ], 
       [ 21.156 , 18.6195, 23.299 , 22.5535, 23.2305, 28.749 , 21.0245], 
       [ 21.7495, 19.614 , 20.3025, 21.706 , 22.853 , 19.623 , 16.7415], 
       [ 20.9715, 21.9505, 21.1895, 21.471 , 21.0445, 21.096 , 19.3295], 
       [ 24.3815, 26.2095, 25.3595, 22.9985, 21.586 , 23.796 , 20.375 ]]) 
mask = np.array([[ True, True, True, True, True, True, True], 
       [ True, True, True, True, True, True, True], 
       [ True, True, True, True, True, True, True], 
       [ True, True, True, True, True, True, True], 
       [False, False, False, False, False, False, False], 
       [False, False, False, False, False, False, False], 
       [False, False, False, False, False, False, False]]) 
marr = np.ma.MaskedArray(arr, mask=~mask) 
marr 

給出:

masked_array(data = 
[[19.189 23.2535 23.1555 23.4655 22.6795 20.3295 19.7005] 
[20.688 20.537 23.8465 21.2265 24.5805 25.842 23.198] 
[22.418 21.0115 21.0355 20.217 24.1275 24.4595 21.981] 
[21.156 18.6195 23.299 22.5535 23.2305 28.749 21.0245] 
[-- -- -- -- -- -- --] 
[-- -- -- -- -- -- --] 
[-- -- -- -- -- -- --]], 
      mask = 
[[False False False False False False False] 
[False False False False False False False] 
[False False False False False False False] 
[False False False False False False False] 
[ True True True True True True True] 
[ True True True True True True True] 
[ True True True True True True True]], 
     fill_value = 1e+20) 

在這種情況下,它也將是可能的,只是壓縮包含至少一個蒙面元素與np.ma.compress_rows所有行:

>>> np.ma.compress_rows(marr) 
array([[ 19.189 , 23.2535, 23.1555, 23.4655, 22.6795, 20.3295, 19.7005], 
     [ 20.688 , 20.537 , 23.8465, 21.2265, 24.5805, 25.842 , 23.198 ], 
     [ 22.418 , 21.0115, 21.0355, 20.217 , 24.1275, 24.4595, 21.981 ], 
     [ 21.156 , 18.6195, 23.299 , 22.5535, 23.2305, 28.749 , 21.0245]]) 
1

假設你的面具等於False從數值數組刪除任何元素的方式將包括它們要麼全部True,或所有False行,那麼你就可以使用mask.all(axis=1)和索引:

In [116]: x 
Out[116]: 
array([[ 1., 0., 0., 0., 0., 0., 0.], 
     [ 0., 1., 0., 0., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0., 0., 0.], 
     [ 0., 0., 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 0., 0., 1., 0.], 
     [ 0., 0., 0., 0., 0., 0., 1.]]) 

In [117]: x[mask.all(axis=1)] 
Out[117]: 
array([[ 1., 0., 0., 0., 0., 0., 0.], 
     [ 0., 1., 0., 0., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0., 0., 0.]]) 
1

爲了說明我的意見:

In [33]: arr = np.arange(12).reshape(3,4) 
In [34]: mask = ((arr+1)%3)>0 
In [35]: mask 
Out[35]: 
array([[ True, True, False, True], 
     [ True, False, True, True], 
     [False, True, True, False]], dtype=bool) 

arr[mask]是1d,因爲通常這個選擇不會返回一個整潔的二維數組。

In [36]: arr[mask] 
Out[36]: array([ 0, 1, 3, 4, 6, 7, 9, 10]) 

我們可以蒙面陣列的解決方案清楚地看到這

In [37]: marr = np.ma.MaskedArray(arr,mask=~mask) 
In [38]: marr 
Out[38]: 
masked_array(data = 
[[0 1 -- 3] 
[4 -- 6 7] 
[-- 9 10 --]], 
      mask = 
[[False False True False] 
[False True False False] 
[ True False False True]], 
     fill_value = 999999) 

ma壓縮返回一維數組

In [39]: marr.compressed() 
Out[39]: array([ 0, 1, 3, 4, 6, 7, 9, 10]) 

隨着8個方面我可以重塑到(4,2) ,但沒有涉及3.

可以掩蓋整個行或列的各種組合s的anyall