如何修改算术运算符(+, - ,x)

时间:2014-05-30 12:33:43

标签: python

我目前正在为Python 3.x编写一个线性代数模块,其中我处理自定义矩阵对象。

有什么方法可以让基本算术运算符如+, - ,*坚持我的矩阵对象?例如 -

>>> A = matrix("1 2;3 4")
>>> B = matrix("1 0; 0 1")
>>> A + B
[2 2]
[3 5]
>>> A * A
[7 10]
[15 22]

现在我已经为添加,乘法等编写了单独的函数,但键入A.multiply(A)比简单A*A更麻烦。

4 个答案:

答案 0 :(得分:5)

您正在寻找special methods。特别是在emulating numerical types section

此外,由于您正在尝试实现矩阵和矩阵是容器,因此您可能会发现为您的类型定义自定义container methods非常有用。

UPDATE:以下是使用特殊方法实现算术运算符的自定义对象示例:

class Value(object):
    def __init__(self, x):
        self.x = x

    def __add__(self, other):
        if not isinstance(other, Value):
            raise TypeError
        return Value(self.x + other.x)

    def __mul__(self, other):
        if not isinstance(other, Value):
            raise TypeError
        return Value(self.x * other.x)

assert (Value(2) + Value(3)).x == 5
assert (Value(2) * Value(3)).x == 6

答案 1 :(得分:2)

除非你专门学习或练习,否则你应该看看数字python,numpy,这是基本线性代数和矩阵的事实上的标准解决方案。它有一个矩阵类,可以满足您的需求。

答案 2 :(得分:1)

您可以覆盖built in methods for numerical types

class matrix:

    def __init__(self, string_matrix):
        self.matrix = string_matrix.split(";")
        for i in range(len(self.matrix)):
            self.matrix[i] = map(int, self.matrix[i].split())

    def __add__(self, other):
        return_matrix = [[i for i in row] for row in self.matrix]
        for i in range(len(self.matrix)):
            for j in range(len(self.matrix[i])):
                return_matrix[i][j] = self.matrix[i][j] + other.matrix[i][j]
        return list_to_matrix(return_matrix)

    def __str__(self):
        return repr(self.matrix)

def list_to_matrix(list_matrix):
    string_form = ""
    for row in list_matrix:
        for item in row:
            if (item != row[-1]): string_form += str(item) + " "
            else: string_form += str(item)
        if (row != list_matrix[-1]): string_form += ";"

    return matrix(string_form)

您可能希望包含一些检查(例如添加不同维度的矩阵,或者将矩阵添加到不是矩阵的内容等),但这只是一个简单的例子。另请注意,我正在使用matrix函数返回list_to_matrix()对象 - 如果这不是所需的功能,您可以很容易地更改它。您将对需要实现的所有其他算术函数使用类似的过程。

<强>输出:

>>> a = matrix("3 4;1 4")
>>> b = matrix("2 3;0 0")
>>> print(a)
[[3, 4], [1, 4]]
>>> print(b)
[[2, 3], [0, 0]]
>>> print(a + b)
[[5, 7], [1, 4]]

正如其他一个答案中所提到的,numpy可能是用于矩阵运算的好资源 - 许多此功能已经内置。

>>> import numpy as np
>>> a = np.matrix("3 4;1 4")
>>> b = np.matrix("2 3;0 0")
>>> print(a)
[[3 4]
 [1 4]]
>>> print(b)
[[2 3]
 [0 0]]
>>> print(a + b)
[[5 7]
 [1 4]]

答案 3 :(得分:0)

如果在类中定义了一些特殊方法,Python将调用它们进行算术运算。定义加法,乘法,除法和减法的示例类:

class motar:

    def __add__(self, other): return "9999"

    def __mul__(self, other): return "8888"

    def __sub__(self, other): return "7777"

    def __div__(self, other): return "6666"

m = [ motar() for x in range(2) ]  # create two instances

# arithmetic operations on class instances will call 
# ... the special methods defined above:

print m[0] + m[1]
print m[0] * m[1]
print m[0] - m[1]
print m[0] / m[1]

给出:

9999
8888
7777
6666