Проблема с перегрузкой оператора умножения для матриц на 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

Поискал про явное указывание типов в параметрах методов, но пишут, что это не работает и нужно проверять внутри метода. Но в моем случае это не работает, т.к. исполнение уходит в другой метод. Можно было бы создать отдельный именованный метод для умножения на число, но меня интересуют какие есть варианты. Готов выслушать любые замечания к коду.


Ответы (0 шт):