2016-11-08 3 views
0

ブーリアンマスクを使用して2D numpy配列をマスキング/スライスする方法について質問があります。ここでは、npの2次元配列xがあります。Python 2D配列、ブールマスクから要素をスライス/除去し、結果を2D配列として保持

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

さて、私のような結果の配列を取得したい、Xの対応する位置yの中

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

要素値はFalseが削除されました、そして新しいがあります2次元配列が返されます。だから私はこの状況のた​​めにこれを得ることができますか?

ご協力いただきありがとうございます。

答えて

1

x[y]は、xの値を選択します。yがTrueです。しかし、配列x[y]は1次元です。あなたは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次元配列を形成していることも発見しました。しかし、なぜそれが望ましい結果を得るために反転されるべきですか? Btw、ここで-1は形を変えています。私は通常、形を変えるために変形(9,10)のように使います。 –

+0

[reshapeを使用している場合](https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html)1次元は「-1」になります。これは、配列のサイズと他の次元の長さに基づいて、実際の次元の長さを推測するように再構成に指示します。基本的には、「正しいことをやってください」という意味です。今、要素の「再形成」[順序を変更しない](http://stackoverflow.com/a/35226493/190597)。 'x [y]'は '0、0、0、0、0、0、0、0、0、1'で始まります。あなたが '1、0、0、0、0、0、0、0、0、0'を望むならば、配列は反転されなければなりません。 – unutbu

+0

お返事ありがとうございます。あなたが提供する方法は、このような状況下では機能します。私は質問がある、配列y(ブール配列)の各列に複数のFalseがある場合、あなたのメソッドが毎回動作しないことがわかった。このような状況について何か提案がありますか?ありがとう。 –