2015-03-13 41 views
0

我想選擇b中的元素,條件是基於a。但是,掩碼msk並不完全捕獲輸出。下面給出的,改形/延伸numpy蒙版

>>> b = np.asarray([[[1, 11], [2, 12]], [[3, 13], [4, 14]], [[5, 15], [6, 16]], [[7, 17], [8, 18]]]) 
>>> b.shape 
(4, 2, 2) 
>>> b 
array([[[ 1, 11], 
     [ 2, 12]], 

     [[ 3, 13], 
     [ 4, 14]], 

     [[ 5, 15], 
     [ 6, 16]], 

     [[ 7, 17], 
     [ 8, 18]]]) 
>>> a = np.asarray([[0, 2], [3, 0], [0, 6], [0, 8]]) 
>>> a.shape 
(4, 2) 
>>> a 
array([[0, 2], 
     [3, 0], 
     [0, 6], 
     [0, 8]]) 
>>> msk = a > 0 
>>> b[msk] 
array([[ 2, 12], 
     [ 3, 13], 
     [ 6, 16], 
     [ 8, 18]]) 
>>> msk 
array([[False, True], 
     [ True, False], 
     [False, True], 
     [False, True]], dtype=bool) 

我想返回[[11, 12], [3, 4], [15, 16], [17, 18]],而不是什麼b[msk]正在返回。直覺上,我認爲還需要在msk中加入另一個維度,將其轉換爲b的形狀,即(4, 2, 2),但只是調用msk.reshape對我來說沒有任何幫助。我想用這樣的面具來解決問題。我怎樣才能轉換實際的面具?

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

回答

2

不知道這是最好的方法,但是:

>>> transposed = np.transpose(b, (2, 0, 1)) 
>>> np.hstack((transposed[0][:, None], transposed[1][:, None]))[msk] 
array([[11, 12], 
     [ 3, 4], 
     [15, 16], 
     [17, 18]]) 

編輯:隨着OP的建議,我們可以把它簡化爲:

>>> np.transpose(b, (0, 2, 1))[msk] 
array([[11, 12], 
     [ 3, 4], 
     [15, 16], 
     [17, 18]]) 
+0

我沒有做'hstack'體操,但得到它的工作 - 謝謝。你是否願意簡化你的解決方案到'transposed = np.transpose(b,(0,2,1));換位[MSK]'?這只是交換'b'的最後兩個維度。使用'轉置'應該也很快。 – orange 2015-03-13 08:24:45

+0

@orange是的,當然。這甚至更好。 ;-) – 2015-03-13 08:27:37