我正在寻找在python中创建具有对称寻址(即矩阵[2,3]和矩阵[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的“Matrix Computations”本书概述了一种可行的寻址方案:

您将数据打包到矢量并按如下方式访问,假设i> = j:

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

你最好使用全方形numpy矩阵。是的,它浪费了存储冗余值的一半内存,但是在Python中滚动自己的对称矩阵会通过将整数存储和处理为Python对象而浪费更多的内存和CPU。

您只需要存储矩阵的下三角形。通常,这是通过一个n(n + 1)/ 2长度列表完成的。您需要重载 __ getitem __ 方法来解释条目的含义。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top