2016-11-08 70 views
0

我有一個關於使用布爾掩碼掩蓋/切片2D numpy數組的問題。在這裏,我有一個np二維數組x,它是python二維數組,切片/從布爾掩模刪除元素,並保持結果爲一個二維數組

x=np.tile(np.arange(10).reshape(10,1),(1,10)) 
[[0 0 0 0 0 0 0 0 0 0] 
[1 1 1 1 1 1 1 1 1 1] 
[2 2 2 2 2 2 2 2 2 2] 
[3 3 3 3 3 3 3 3 3 3] 
[4 4 4 4 4 4 4 4 4 4] 
[5 5 5 5 5 5 5 5 5 5] 
[6 6 6 6 6 6 6 6 6 6] 
[7 7 7 7 7 7 7 7 7 7] 
[8 8 8 8 8 8 8 8 8 8] 
[9 9 9 9 9 9 9 9 9 9]] 

x是一個10乘10陣列,其每列都是相同的。如果有更好的方法來產生這個,你能指出一下嗎?謝謝。再有就是一個布爾數組,

y=(x!=np.arange(10)) 
[[False True True True True True True True True True] 
[ True False True True True True True True True True] 
[ True True False True True True True True True True] 
[ True True True False True True True True True True] 
[ True True True True False True True True True True] 
[ True True True True True False True True True True] 
[ True True True True True True False True True True] 
[ True True True True True True True False True True] 
[ True True True True True True True True False True] 
[ True True True True True True True True True False]] 

現在,我想要得到的結果數組一樣,

[[1 0 0 0 0 0 0 0 0 0] 
[2 2 1 1 1 1 1 1 1 1] 
[3 3 3 2 2 2 2 2 2 2] 
[4 4 4 4 3 3 3 3 3 3] 
[5 5 5 5 5 4 4 4 4 4] 
[6 6 6 6 6 6 5 5 5 5] 
[7 7 7 7 7 7 7 6 6 6] 
[8 8 8 8 8 8 8 8 7 7] 
[9 9 9 9 9 9 9 9 9 8]] 

在X,其相應的位置Y中的元素已經False值被刪除,而新的2D數組被返回。那麼我怎麼能得到這種情況呢?

非常感謝您的幫助。

回答

1

x[y]x中選擇值,其中y爲真。然而,數組x[y]是一維的。您可以使用reshape(9,-1)將其重新塑造成9行(但無論多少列有意義)。爲了獲得理想的結果,您必須從左向右翻轉陣列:

In [81]: np.fliplr(x[y].reshape(9,-1)) 
Out[84]: 
array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [2, 2, 1, 1, 1, 1, 1, 1, 1, 1], 
     [3, 3, 3, 2, 2, 2, 2, 2, 2, 2], 
     [4, 4, 4, 4, 3, 3, 3, 3, 3, 3], 
     [5, 5, 5, 5, 5, 4, 4, 4, 4, 4], 
     [6, 6, 6, 6, 6, 6, 5, 5, 5, 5], 
     [7, 7, 7, 7, 7, 7, 7, 6, 6, 6], 
     [8, 8, 8, 8, 8, 8, 8, 8, 7, 7], 
     [9, 9, 9, 9, 9, 9, 9, 9, 9, 8]]) 
+0

感謝您的回覆。我也用x [y],發現它形成了一維數組。但爲什麼它應該翻轉,以獲得理想的結果?順便說一句,這裏重塑的是-1。我通常使用像重塑(9,10)來重塑。 –

+0

[當使用重塑](https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html)時,一個維度可以是'-1'。它告訴重塑根據數組大小和其他尺寸長度推斷實際尺寸長度。它基本上意味着「做正確的事情」。現在'reshape' [不改變順序](http://stackoverflow.com/a/35226493/190597)的元素。 'x [y]'以'0,0,0,0,0,0,0,0,1'開頭。如果你想要'1,0,0,0,0,0,0,0,0,0',那麼陣列必須被翻轉。 – unutbu

+0

感謝您的回覆。你提供的方法可以在這種情況下工作。我有一個問題,如果數組y(布爾數組)中的每列都有多個False,那麼我發現你的方法不能每次都工作。你對這種情況有什麼建議嗎?謝謝。 –