2017-07-22 8 views
0

私はPythonで初心者です。次のコードは理解できません。 I代わりpythonの行列論理インデックスについて

a=np.matrix([[1,2,3],[1,3, 4]]) 
b=np.matrix([[0,1]]) 
print(np.where(b==1)) 
test1=a[np.nonzero(b==1),:] 
print(test1.sum()) 
ind,_=np.nonzero(b==1); #found in a code that I'm trying to undestand (why the _ ?) 

test2=a[ind,:] 
print(test2.sum()) 

私がフル行列の和を有する第一の場合に

(array([0]), array([1])) 
14 
6 

を与え、TEST1とTEST2が私に同じ結果(図8に示すように、2行目の和)を得ることが期待、Iは、(代わりに第2の)最初の行の和を有する第二ケース

になぜこの現象

+0

'nonzero'はタプルを返します。したがって、最初のケースではタプルを使用してスライスします。2番目の例では、 '_'がスローアウェイ/プレースホルダー変数として使用されています(これについてはここで答えが見つかります)ので、' nonzero'によって返されたタプルの最初の要素だけを使ってスライスします。結果 – gionni

答えて

1
In [869]: a 
Out[869]: 
matrix([[1, 2, 3], 
     [1, 3, 4]]) 
In [870]: b 
Out[870]: matrix([[0, 1]]) 
を理解していませんこの使用

nonzeroと同じである。

In [871]: np.where(b==1) 
Out[871]: (array([0], dtype=int32), array([1], dtype=int32)) 
In [872]: np.nonzero(b==1) 
Out[872]: (array([0], dtype=int32), array([1], dtype=int32)) 

これは、各ディメンション(np.matrix 2)のための1つの割り出しアレイをタプルを与えます。 ind,_=はそれらの配列をアンパックし、2番目の配列をスローします。 _は、私が使っているようなインタラクティブなセッションで再利用されます。

In [873]: ind,_ =np.nonzero(b==1) 
In [874]: ind 
Out[874]: array([0], dtype=int32) 

where戻りaから(0,1)の値で選択。しかし、それはあなたが欲しいものですか?

In [875]: a[np.where(b==1)] 
Out[875]: matrix([[2]]) 

:追加するインデックスに配列全体を行い、しかし添加寸法を有します。再び、おそらく私たちが

In [876]: a[np.where(b==1),:] 
Out[876]: 
matrix([[[1, 2, 3]], 

     [[1, 3, 4]]]) 

indたいのは、単一のインデックス配列ではない、とそうaから0の行を選択します。

In [877]: a[ind,:] 
Out[877]: matrix([[1, 2, 3]]) 
In [878]: 

しかしb==1bの第二の要素を見つけ、その後、aの2列目を選択するようになっていますか? abnp.matrixあるため、インデックスをb

In [881]: a[:,np.where(b==1)[1]] 
Out[881]: 
matrix([[2], 
     [3]]) 

の第二列に対応するaから

In [878]: a[np.where(b==1)[1],:] 
Out[878]: matrix([[1, 3, 4]]) 

または第二列:我々はwhereから2番目のインデックス配列を使用する必要があることを行うために、結果は常に2dです。 cアレイについて

where我々は、一般的にも、2D、新しいアレイを構築するnp.arrayを使用して助言単一要素タプル

In [882]: c=np.array([0,1]) 
In [883]: np.where(c==1) 
Out[883]: (array([1], dtype=int32),) 
In [884]: a[_,:]    # here _ is the last result, Out[883] 
Out[884]: matrix([[1, 3, 4]]) 

を生成します。 np.matrixはMATLABユーザーの便宜のために、新しいnumpyユーザーを混乱させることがあります。

関連する問題