Проблема с перегрузкой оператора умножения для матриц на python
Начал серьёзное обучение питону. Есть цель написать калькулятор матриц, для этого был создан класс Matrix:
import numpy as np
import random as rd
class Matrix:
row = None
column = None
arr = np.array(([[7, 3, 8], [8, 5, 2], [4, 7, 3]]), int)
def __init__(self, m, n):
a = np.ones((m, n), int)
self.arr = a
self.row = m
self.column = n
def rand(self, x, y):
a = np.array(self.arr)
for i in range(len(a)):
for j in range(len(a[0])):
a[i][j] = rd.randint(x, y)
self.arr = a
def transpose(self):
a = np.array(self.arr)
return np.transpose(a)
def __mul__(self, other):
if self.column != other.row:
ln = "Матрицы не могут перемножаться!"
ll = "\nКоличество столбцов 1-ой матрицы и кол-во строк 2ой матрицы не равны!"
return ln + ll
a = np.array(self.arr)
b = np.array(other.arr)
c = Matrix(self.row, other.column)
z = 0
for i in range(len(a)):
for j in range(len(b[0])):
z = 0
for k in range(len(b)):
z += a[i][k] * b[k][j]
c[i][j] = z
return c
def __mul__(self, other: int):
a = np.array(self.arr)
c = a * other
return c
def __rmul__(self, other: int):
a = np.array(self.arr)
c = a * other
return c
def __add__(self, other):
if self.row != other.row or self.column != other.column:
return "Нельзя сложить матрицы! У данных матриц разная размерность!"
a = np.array(self.arr)
b = np.array(other.arr)
c = a + b
return c
def __sub__(self, other):
if self.row != other.row or self.column != other.column:
return "Невозможная операция! У данных матриц разная размерность!"
a = np.array(self.arr)
b = np.array(other.arr)
c = a - b
return c
def __pow__(self, power, modulo=None):
if self.row != self.column:
return "Операция невозможна! Матрица не квадратная!"
if power < 2:
return "Введена некорректная степень!"
a = Matrix(2, 2)
a.arr = np.array(self.arr)
b = Matrix(2, 2)
b.arr = np.array(self.arr)
for i in range(power-1):
b = b * a
return b
def __getitem__(self, index):
return self.arr[index]
def __str__(self):
return str(self.arr)
Проблема заключается в перегрузке оператора умножения, у меня в коде есть 3 блока: Первый для перемножения матриц, остальные два для умножения матрицы на число. Но при попытке умножения матрицы на матрицу питон прибегает к перегрузке, предназначенной для умножения матрицы на число и получается вот что:
d = Matrix(3, 3)
e = Matrix(3, 2)
d.rand(10, 20)
e.rand(1, 10)
s = d * e
print(d)
print()
print(e)
print()
print(s)
Вывод:
[[18 20 18]
[11 18 14]
[18 13 15]]
[[ 1 3]
[10 8]
[ 8 4]]
[[array([[ 18, 54],
[180, 144],
[144, 72]]) array([[ 20, 60],
[200, 160],
[160, 80]]) array([[ 18, 54],
[180, 144],
[144, 72]])]
[array([[ 11, 33],
[110, 88],
[ 88, 44]]) array([[ 18, 54],
[180, 144],
[144, 72]]) array([[ 14, 42],
[140, 112],
[112, 56]])]
[array([[ 18, 54],
[180, 144],
[144, 72]]) array([[ 13, 39],
[130, 104],
[104, 52]]) array([[ 15, 45],
[150, 120],
[120, 60]])]]
Process finished with exit code 0
Если закомментировать перегрузки умножения на число, то все работает нормально:
[[11 14 20]
[10 20 12]
[13 11 15]]
[[ 2 9]
[ 3 10]
[ 5 6]]
[[164 359]
[140 362]
[134 317]]
Process finished with exit code 0
Поискал про явное указывание типов в параметрах методов, но пишут, что это не работает и нужно проверять внутри метода. Но в моем случае это не работает, т.к. исполнение уходит в другой метод. Можно было бы создать отдельный именованный метод для умножения на число, но меня интересуют какие есть варианты. Готов выслушать любые замечания к коду.