2016-04-02 9 views
-2

私は以下の問題に助けが必要です。Pythonでブールインデックスを作成した後の入力の形状を維持する

Suppose X = [1 3 0 8 
      1 4 6 0 
      2 0 7 8 ] 
mask = (X != 0) 

mask = [ T T F T 
     T T T F 
     T F T T] 
X1 = X[(mask,np.newaxis)] 

その出力X1形状(9,1)

であるが、私はX1は、(3,3)のようにしたい、すなわち、マスクされたエントリを除き、Xと同様の形状を維持します。

X1 = [1 3 8 
    1 4 6 
    2 7 8 ] 

誰かが私を助けることができますか?ありがとうございました。

Xのすべての行にはゼロが含まれ、reshape()は使用しません。ここでの作業は

X= np.array([[1,3,0,8],[1,4,6,0],[2,0,7,8]]) 
mask = (X!=0) 
X1=X[(mask,np.newaxis)] 

出力Xは形状(9,1)です。 X1が(3,3)のようになる方法はありますか?

+2

「X!= 0」の条件を満たす要素が8つしかない場合はどうなりますか? – mgilson

+0

これはnumpyに関連していますか? –

+0

@mgilson、問題の性質は、すべての行に0が含まれることになるため、上記の問題は問題にならないでしょう。 – samquest

答えて

1

あなたの質問には正しい構文も含まれていないので、Pythonで簡単に何かを始めたいと思うかもしれません。私はこれがちょうど擬似コードの試みだったと思っています。しかし、ここであなたが望むマスクを行うためのコードがあります。

import numpy as np 
X = np.array([1, 3, 0, 8, 1, 4, 6, 0, 2, 0, 7, 8]) 
indicies_we_want = np.where(X > 0) # Results in an array containing the indicies of X we want to keep 
result = np.take(X, indicies_we_want) # Filter by these indicies 
result = result.reshape(3, 3) # Reshape to desired result 
print result 

このコードはかなり圧縮されている可能性がありますが、わかりやすくするために各ステップをご説明したいと思います。

コメントセクションで指摘されているように、通常、リシェープは良いアイデアではありません。なぜなら、0を除外して9個の要素が残っていることがわかっていない限りです。あなたが記述した場合、私たちは確かにこれを知っていますが、特定の配列ではそれほど多くはありません。変形と

+0

はいコードと擬似コードが混在しています。すべての行に0が含まれているので、配列の形状は問題ありませんが、私はreshape()を使いたくありません。ここに作業コード、plzがあります。 X = np.array([[1,3,0,8]、[1,4,6,0]、[2,0,7,8]])。 マスク=(X!= 0)。 X1 = X [(マスク、np.newaxis)]。出力Xは形状(9,1)である。元の質問(plz)に述べられているように、X1が(3,3)であるという方法はありますか?あなたの助けをありがとう – samquest

+0

私の答えは、まさにあなたが形作りをするために必要なものです。それはあなたの(9,1)を(3,3)に変えます。私は 'X1'の代わりに' result'という変数を呼び出しました。 – mwm314

+3

これは 'result = X [X!= 0] .reshape(3,3)'と同じではありませんか? –

1
In [173]: x=[[1,3,0,8],[1,4,6,0],[2,0,7,8]] 
In [174]: xa=np.array(x) 

溶液:

In [175]: xa[xa!=0].reshape(3,3) 
Out[175]: 
array([[1, 3, 8], 
     [1, 4, 6], 
     [2, 7, 8]]) 

溶液変形なし:明らか

In [176]: np.array([i[i!=0] for i in xa]) 
Out[176]: 
array([[1, 3, 8], 
     [1, 4, 6], 
     [2, 7, 8]]) 

両方が行ごとに1つだけ削除さに依存します。

共通の列は削除されません。コード内の何も、結果が変形可能であるということを基礎とするnumpyに伝えません。したがって、ブーリアンインデックスはフラット化された配列で動作します。

In [177]: xa[xa!=0] 
Out[177]: array([1, 3, 8, 1, 4, 6, 2, 7, 8]) 
In [178]: xa.flat[xa.flat!=0] 
Out[178]: array([1, 3, 8, 1, 4, 6, 2, 7, 8]) 

私は余分な0を投げてしまい、このインデックス付けは同じように動作します。それを3x3に改造する努力は失敗するでしょう。


基礎となるデータ・バッファは、1D平坦であり、それが唯一の理由shapestriding属性の2Dとして表示されることことに留意してください。要素を選択(またはスキップ)するとコピーが作成され、1次元コピーは2次元コピーと同じくらい簡単で高速です。 reshapeはデータバッファを変更せず、shape属性のみを変更します。

関連する問題