Python 对称可寻址矩阵

Python 对称可寻址矩阵,python,data-structures,matrix,Python,Data Structures,Matrix,我希望在python中创建一个具有对称寻址的二维整数矩阵(即矩阵[2,3]和矩阵[3,2]将返回相同的值)。整数将进行加法和减法运算,并用于逻辑比较。我最初的想法是先创建integer对象,然后尝试用一些python等价的指针填充列表。不过我不知道怎么做。实现这一点的最佳方法是什么?我应该使用列表还是其他数据结构?您只需要存储矩阵的下三角。通常,这是通过一个n(n+1)/2长度列表完成的。您需要重载\uuu getitem\uuu方法来解释条目的含义。您只需要存储矩阵的下三角。通常,这是通过一个

我希望在python中创建一个具有对称寻址的二维整数矩阵(即矩阵[2,3]和矩阵[3,2]将返回相同的值)。整数将进行加法和减法运算,并用于逻辑比较。我最初的想法是先创建integer对象,然后尝试用一些python等价的指针填充列表。不过我不知道怎么做。实现这一点的最佳方法是什么?我应该使用列表还是其他数据结构?

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

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

Golub和Van Loan的《矩阵计算》一书概述了一个可行的寻址方案:

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

a_ij = A.vec((j-1)n - j(j-1)/2 + i)    
Golub和Van Loan的《矩阵计算》一书概述了一个可行的寻址方案:

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

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

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

您最好使用一个完整的正方形numpy矩阵。是的,它浪费了存储冗余值的一半内存,但是在Python中滚动自己的对称矩阵将浪费更多的内存和CPU,因为它将整数作为Python对象存储和处理

一种更简单、更简洁的方法是只使用带有排序元组的字典作为键。元组与矩阵索引相对应。覆盖
\uuuuu getitem\uuuuuuuuuuuuuuuu
\uuuuuuuuu setitem\uuuuuuuuuuuuuuuuuuuu
以按排序元组访问字典;下面是一个示例类:

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)
矩阵=矩阵() >>>矩阵[2,3]=1066 >>>打印矩阵 {(2, 3): 1066} >>>矩阵[2,3] 1066 >>>矩阵[3,2] 1066 >>>矩阵[1,1] 回溯(最近一次呼叫最后一次): 文件“”,第1行,是否在中? 文件“z.py”,第3行,在_getitem中__ 返回super(矩阵,self)。\uuuu getitem\uuuuu(元组(排序(索引))) 键错误:(1,1)
一种更简单、更简洁的方法是只使用带有排序元组的字典作为键。元组与矩阵索引相对应。覆盖
\uuuuu getitem\uuuuuuuuuuuuuuuu
\uuuuuuuuu setitem\uuuuuuuuuuuuuuuuuuuu
以按排序元组访问字典;下面是一个示例类:

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)
矩阵=矩阵() >>>矩阵[2,3]=1066 >>>打印矩阵 {(2, 3): 1066} >>>矩阵[2,3] 1066 >>>矩阵[3,2] 1066 >>>矩阵[1,1] 回溯(最近一次呼叫最后一次): 文件“”,第1行,是否在中? 文件“z.py”,第3行,在_getitem中__ 返回super(矩阵,self)。\uuuu getitem\uuuuu(元组(排序(索引))) 键错误:(1,1)
但从数学上讲,这不应该奏效——至少,如果我对Calc 1的记忆是正确的,我不确定我是否理解。什么是行不通的?但从数学上讲,这是行不通的——至少,如果我对Calc 1的记忆是正确的,我不确定我是否理解。什么不起作用?