Почему мой код не умножает матрицу на матрицу а выдаёт ошибку?

Рейтинг: -2Ответов: 3Опубликовано: 06.08.2023

Мой код:

import numpy as np

n, m = [int(i) for i in input().split()]
A = [input().split() for _ in range(n)]
input()
B = [input().split() for _ in range(n)]
print(np.dot(A, B))

Моя ошибка:

Traceback (most recent call last):
  File "jailed_code", line 6, in <module>
    print(np.dot(A,B))
ValueError: data type must provide an itemsize

Тестовые данные:

2 2
1 2
3 2

2 2
3 2
1 1

Ответы

▲ 2
  1. n, m = [int(i) for i in input().split()]
    Правильно, но я в дальнейшем коде не вижу употребление переменной m.

  2. A = [input().split() for _ in range(n)]
    Вы получите список списков строк, а не список чисел (и отсутствует перевод на int или float).

  3. input()
    Вы хотите от пользователя ввод, но не сохраняете его в переменной
    (т.е. просто бросите его, нигде его не употребляя).

  4. B = [input().split()for _ in range(n)]
    То же самое, что для B - см. 2.

  5. print(np.dot(A,B))
    Не возможно умножить 2 списка с элементами типа str.

▲ 0

Потому что вы пытаетесь перемножить строки. input() всегда возвращает строку, поэтому A и B содержат списки строк вида

A: [['1', '2'], ['3', '2']]
B: [['3', '2'], ['1', '1']]

Поэтому эти строки нужно преобразовать в целые числа, например, с помощью метода numpy.ndarray.astype, предварительно преобразовав списки в np.array:

import numpy as np

strings="""2 2
1 2
3 2
2 2
3 2
1 1""".split('\n')

def input():
    global strings
    return strings.pop(0) + '\n'

n, m = [int(i) for i in input().split()]
A = [input().split() for _ in range(n)]
input()
B = [input().split()for _ in range(m)]
print(np.dot(np.array(A).astype(int),np.array(B).astype(int)))
[[ 5  4]
 [11  8]]
▲ 0

Вход устроен так: строка с размерами первой матрицы, строки со строками первой матрицы, пустая строка, строка с размерами второй матрицы, строки со строками второй матрицы. Логично сделать функцию для чтения матрицы.

Вижу две ошибки: данные матриц не переводятся из строк в числа, во второй матрице не прочитаны её размеры. Исправляем:

import numpy as np


def read_matrix():
    # пропустить m, но проверить формат
    n, _ = map(int, input().split())

    # прочитать n строк матрицы
    return [
        list(map(int, input().split()))
        for _ in range(n)
    ]


def main():
    m1 = read_matrix()  # прочитать первую матрицу
    input()             # пропустить пустую строку
    m2 = read_matrix()  # прочитать вторую матрицу

    print(m1)
    print(m2)
    print(np.dot(m1, m2))
    

main()
$ cat input.txt
2 2
1 2
3 2

2 2
3 2
1 1

$ python matrices.py < input.txt
[[1, 2], [3, 2]]
[[3, 2], [1, 1]]
[[ 5  4]
 [11  8]]