Задать вопрос
@paveldunaev

Как исправить ошибку can't multiply sequence by non-int of type 'float'?

Хочу получить вектор Xi: скалярное произведение i-й строки матрицы на главную диагональ матрицы, но код выдает ошибку: can't multiply sequence by non-int of type 'float'
def sunction(array):
    ans=[]
    vec=[]
    for i in array:
        for j in i:
            if array.index(i)==i.index(j):
                ans+=[j]
    result = 0
    for i in range(len(m)):
        result += ans[i]*m[i:]
    return ans,result
  • Вопрос задан
  • 1229 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@teenager_python
Ошибка возникает, потому что в строке result += ans[i]*m[i:] вы пытаетесь умножить элемент типа списка на элемент типа float. Чтобы исправить эту ошибку, вам нужно получить элементы из i-й строки и главной диагонали в виде чисел, а не списков.
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Код феерический.
#?!??!?!
    for i in array:
        for j in i:
            if array.index(i)==i.index(j):
                ans+=[j]

не будет работать, если в строке матрицы одно и то же число встречается дважды.
Ну и зачем перебирать столбцы, если тебе уже известен индекс столбца - он равен индексу строки? Функцию range() ты вроде уже знаешь, освой метод append() списка, заодно.
diagonal = []
for i in range(len(array)):  # цикл по номерам строк матрицы
    diagonal.append(array[i, i])  # берём элементы, у которых номер строки и столбца одинаков


ans[i]*m[i:]
Ты умножаешь элемент массива ans[i] на список строк чего-то по имени m. Что такое m, оно же не определено в функции?
X = []
for i in range(len(array)):  # перебираем номера строк массива array
    x_item = 0  # скалярное произведение будет тут
    for j in range(len(diagonal)):  # перебираем номера элементов диагонали
        x_item += diagonal[j] * array[i, j]  # добавляем очередную часть произведения
    X.append(x_item)

То же самое можно записать короче, например, так:
X = []
for row in array:
    X.append(sum( d*r for d, r in zip(diagonal, row) ))

Но это сложнее для понимания новичку.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы