我正在寻找在python中创建具有对称寻址(即矩阵[2,3]和矩阵[3,2]将返回相同值)的2d整数矩阵。整数将对它们进行加法和减法,并用于逻辑比较。我最初的想法是预先创建整数对象,并尝试用一些python等效的指针填充列表列表。不过,我不知道怎么做。实现这一点的最佳方法是什么,我应该使用列表还是其他数据结构?
答案 0 :(得分:3)
Golub和Van Loan的“矩阵计算”一书概述了一种可行的寻址方案:
您将数据打包到矢量并按如下方式访问,假设i> = j:
a_ij = A.vec((j-1)n - j(j-1)/2 + i)
答案 1 :(得分:2)
你最好使用全方形numpy矩阵。是的,它浪费了存储冗余值的一半内存,但是在Python中滚动自己的对称矩阵会通过将整数存储和处理为Python对象而浪费更多的内存和CPU。
答案 2 :(得分:1)
您只需要存储矩阵的下三角形。通常,这是通过一个n(n + 1)/ 2长度列表完成的。您需要重载__getitem__
方法来解释条目的含义。
答案 3 :(得分:1)
更简单,更简洁的方法是使用带有排序元组的字典作为键。元组与矩阵索引相对应。覆盖__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)