2013-04-02 34 views
3

我有以下的數組:試圖掩蓋基於值2D numpy的陣列中的一列

[[ 6.   105.    2.    8.09841881] 
[ 6.   105.    4.    9.34220351] 
[ 6.   105.    6.    9.97663435] 
[ 6.   1001.    2.    9.57108242] 
[ 6.   1001.    4.   12.22355794] 
[ 6.   1001.    6.   13.57295942] 
[ 12.   1001.    2.   12.37474466] 
[ 12.   1001.    4.   17.45334004] 
[ 12.   1001.    6.   19.88499289] 
[ 18.   1007.    2.   16.09076561] 
[ 18.   1007.    4.   23.43742275] 
[ 18.   1007.    6.   27.73041646]] 

我試圖僅提取與所述第一元件是一個六經由

print ma.MaskedArray(a, mask=(np.ones_like(a)*(a[:,0]==6.0)).T) 

我從問題「mask a 2D numpy array based on values in one column」得到。然而,我得到

File "./Prova.py", line 170, in <module> 
print ma.MaskedArray(a, mask=(np.ones_like(a)*(a[:,0]==6.0)).T) 
ValueError: operands could not be broadcast together with shapes (12,4) (12) 

你有線索爲什麼這不起作用?

這個問題可能是愚蠢的,但請自我承擔,因爲我剛開始編程python。 :-)

+0

您可能需要在您的掩碼中插入一個'np.newaxis'。 – mgilson

+0

這樣做會怎樣,我該怎麼做? –

回答

4

設置一些測試數據上工作:

>>> a = np.arange(12*4).reshape((12,4)) 

首先,我們「分配」空間,爲我們遮片陣列:

>>> mask = np.empty(a.shape,dtype=bool) 

現在我們不能分配到它從a == 6第一列直接,因爲他們沒有適當的形狀:

>>> mask[:,:] = a[:,0] == 6 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: operands could not be broadcast together with shapes (12,4) (12) 

但我們可以老兄adcast通過,使之成爲一個2-d陣列簡單地插入一個newaxis我們的a到正確的形狀的第一列:

>>> mask[:,:] = (a[:,0] == 6)[:,np.newaxis] 

正如我們可以看到,我們的掩模現在是正確的。

>>> mask 
array([[ 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, False, False, False], 
     [False, False, False, False]], dtype=bool) 

現在我們只是讓我們的蒙面陣列坐下來享受:)。

>>> ma.MaskedArray(a,mask=mask) 
masked_array(data = 
[[-- -- -- --] 
[-- -- -- --] 
[-- -- -- --] 
[-- -- -- --] 
[-- -- -- --] 
[20 21 22 23] 
[24 25 26 27] 
[28 29 30 31] 
[32 33 34 35] 
[36 37 38 39] 
[40 41 42 43] 
[44 45 46 47]], 
      mask = 
[[ 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 False False False] 
[False False False False]], 
     fill_value = 999999) 
+0

我不相信'.T'會做任何事情,因爲第一行是一個1d數組。 – askewchan

+0

它一直不工作。我得到: 文件「./Prova.py」,第171行,在 mask =(np.ones_like(a)*(a [:,0] == 6.0))。T ValueError:操作數無法與形狀一起播出(12,4)(12) –

+0

@FerdinandoRandisi - 你說得對。我正在努力... – mgilson