我目前正在为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
更麻烦。
答案 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