如何实现对所有子矩阵元素的添加?

时间:2016-05-24 18:45:18

标签: python matrix

我正在尝试使用普通的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]]

我不清楚应该采用哪种神奇方法才能使其正常工作?

2 个答案:

答案 0 :(得分:1)

首先,从list继承是一个不好的举动。矩阵不支持列表所执行的操作类型;例如,您不能appendextend矩阵,项目分配完全不同。您的矩阵应包含列表,而不是列表。

至于你需要什么神奇的方法,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__