2016-06-18 4 views
2

行列の数は(回転などの結果として)たくさんありますが、それらは必ず一度しか格納しません。私は約がセットを使用して考えた:行列の集合

print set([np.matrix([[0, 0],[0, 1],[1, 1],[2, 1]]), 
np.matrix([[0, 0],[1, 0],[1, -1],[1, -2]])]) 

残念ながら、私が手:

TypeError: unhashable type: 'matrix'

セットは、繰り返しを避けるために正確に正しいデータ型である、と労働組合を使用することができるでしょうので、それは悲しいです

Pythonで行列の集合を扱うにはどうすればいいですか?

+1

これは役立つかもしれないhttp://stackoverflow.com/questions/1939228/constructing-a-python-set-from-a-numpy-matrix –

+0

あなたのpythonバージョンは何ですか?そしてナンシー? – Kasramvd

+0

@Kasravand:2.7 – Basj

答えて

0
In [299]: m1 
Out[299]: 
matrix([[0, 0], 
     [0, 1], 
     [1, 1], 
     [2, 1]]) 

In [300]: m2 
Out[300]: 
matrix([[ 0, 0], 
     [ 1, 0], 
     [ 1, -1], 
     [ 1, -2]]) 

In [297]: set([tuple(m1.A1),tuple(m2.A1)]) 
Out[297]: {(0, 0, 0, 1, 1, 1, 2, 1), (0, 0, 1, 0, 1, -1, 1, -2)} 

m1.A1単純なリストとして表示さ1Dアレイにマトリックス変換します。 tupleにラップすると、ハッシュ可能なオブジェクトになります。

setはキー付きで値はない辞書のようです。両方とも、各キーを「ハッシュ」に変換することで、迅速なアクセス(およびinテスト)を提供します。なぜそれがタプルを必要とするのか、リストとは対照的に、それは不変でなければならないということです。行列の値の1つを変更すると、ハッシュが変わります。

A1(または他のレーベル)がなければ、動作しません。tuple(m1)をご覧ください。

In [302]: set([tuple(m1),tuple(m2)]) 
... 
TypeError: unhashable type: 'matrix' 

In [303]: tuple(m1) 
Out[303]: (matrix([[0, 0]]), matrix([[0, 1]]), matrix([[1, 1]]), matrix([[2, 1]])) 

また、行列を文字列表現に変換して保存することもできます。これらのコンバージョンはスペースを節約するものではなく、すべてコンバージョン単価が発生します。

これらの行列を比較する方法を調べる必要があるかもしれません。何が他のものと違うの?

一致する要素の平等:

In [306]: m1==m2 
Out[306]: 
matrix([[ True, True], 
     [False, False], 
     [ True, False], 
     [False, False]], dtype=bool) 

In [307]: (m1==m2).all() 
Out[307]: False 

In [308]: (m1==m1).all() 
Out[308]: True 

もちろん、それらはすべて同じ形状である必要があります。

形状が異なる場合、要素ごとに比較を行うことができないため、ブールスカラーを返します。

In [309]: m1==m1.T 
Out[309]: False 

m2[:]が異なるオブジェクトを同じ値を持っていますが、ある)あなたはオブジェクトID

In [314]: set([id(m1),id(m2),id(m2[:])]) 
Out[314]: {3029619684, 3036025828, 3036825892} 

を比較することができますが、ビューの平等をキャプチャしません。

また、値を変更するとm2[2,1]=1の場合、idは変更されませんが、tuple(m2.A1)ハッシュと等価テストが変更されます。