質問

Pythonで対称アドレッシング(つまり、matrix [2,3]とmatrix [3,2]が同じ値を返す)を持つ整数の2Dマトリックスを作成しようとしています。整数には加算と減算が行われ、論理比較に使用されます。私の最初のアイデアは、整数オブジェクトを前もって作成し、Pythonの同等のポインターでリストのリストを埋めることでした。しかし、どうすればいいのかわかりません。これを実装する最良の方法は何ですか?リストまたは別のデータ構造を使用する必要がありますか?

役に立ちましたか?

解決

よりシンプルでクリーンな方法は、ソートされたタプルをキーとして辞書を使用することです。タプルはマトリックスインデックスに対応します。ソートされたタプルによって辞書にアクセスするには、 __ getitem __ および __ setitem __ をオーバーライドします。ここにクラスの例があります:

class Matrix(dict):
    def __getitem__(self, index):
        return super(Matrix, self).__getitem__(tuple(sorted(index)))
    def __setitem__(self, index, value):
        return super(Matrix, self).__setitem__(tuple(sorted(index)), value)

そして次のように使用します:

>>> matrix = Matrix()
>>> matrix[2,3] = 1066
>>> print matrix
{(2, 3): 1066}
>>> matrix[2,3]
1066
>>> matrix[3,2]
1066
>>> matrix[1,1]
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "z.py", line 3, in __getitem__
    return super(Matrix, self).__getitem__(tuple(sorted(index)))
KeyError: (1, 1)

他のヒント

GolubとVan Loanの「行列計算」本は、実行可能なアドレス指定スキームの概要を示しています。

i&gt; = jを想定して、データをベクトルにパックし、次のようにアクセスします:

a_ij = A.vec((j-1)n - j(j-1)/2 + i)    

おそらく、完全な正方形のnumpy行列を使用する方が良いでしょう。はい、冗長な値を保存するメモリの半分が無駄になりますが、Pythonで独自の対称行列をローリングすると、整数をPythonオブジェクトとして保存および処理することにより、さらに多くのメモリとCPUが無駄になります。

マトリックスの下三角部分のみを保存する必要があります。通常、これは1つのn(n + 1)/ 2長リストで行われます。エントリの意味を解釈するには、 __ getitem __ メソッドをオーバーロードする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top