我正在尝试使用普通的python(没有numpy等)为简单的操作实现矩阵类。
以下是其中的一部分:
class Matrix(list):
def __getitem__(self, item):
try:
return list.__getitem__(self, item)
except TypeError:
rows, cols = item
return [row[cols] for row in self[rows]]
它可以做这样的事情:
m = Matrix([[i+j for j in [0,1,2,3]] for i in [0,4,8,12]])
print(m[0:2, 0:2])
will print: [[0, 1], [4, 5]]
我还希望能够按给定值添加/乘以所有子矩阵元素,例如:
m[0:2, 0:2] += 1
print(m[0:2, 0:2])
should print: [[1, 2], [5, 6]]
我不清楚应该采用哪种神奇方法才能使其正常工作?
答案 0 :(得分:1)
首先,从list
继承是一个不好的举动。矩阵不支持列表所执行的操作类型;例如,您不能append
或extend
矩阵,项目分配完全不同。您的矩阵应包含列表,而不是列表。
至于你需要什么神奇的方法,m[0:2, 0:2] += 1
大致翻译成以下内容:
temp = m.__getitem__((slice(0, 2), slice(0, 2)))
temp = operator.iadd(temp, 1)
m.__setitem__((slice(0, 2), slice(0, 2)), temp)
其中operator.iadd
尝试temp.__iadd__
,temp.__add__
和(1).__radd__
执行添加。
您需要实现__getitem__
和__setitem__
来检索子矩阵并分配新的子矩阵。此外,__getitem__
将需要返回矩阵,而不是列表。
您应该同时实施__add__
和__iadd__
;虽然仅__add__
就足够了这种情况,但__iadd__
等操作必须m += 1
才能就地工作,而不是用新的矩阵对象替换m
。< / p>
答案 1 :(得分:0)
否即可。如果魔法是:{/ 1>,__iadd__
会为你做的伎俩
m += 2
但魔法在m[0:2, 0:2]
上执行。您需要确保在切割矩阵时获得不同的对象,而不是列表列表,因为列表列表不支持__iadd__
。