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)
ハッシュと等価テストが変更されます。
これは役立つかもしれないhttp://stackoverflow.com/questions/1939228/constructing-a-python-set-from-a-numpy-matrix –
あなたのpythonバージョンは何ですか?そしてナンシー? – Kasramvd
@Kasravand:2.7 – Basj