Проблема при умножении двумерных списков

#python #arrays #list #multidimensional-array

#python #массивы #Список #многомерный массив

Вопрос:

На самом деле мне нужна помощь, чтобы решить проблему, связанную с умножением двумерных списков. Проблема в том, что у меня есть два списка, a и b :

 a = [[-0.104],[-0.047],[-0.046]]
b = [[0.183, 0.366, 0.456], [0.971, 0.156, 0.856]]
  

Я хочу умножить каждый элемент в a на соответствующий элемент в первом подсписке b таким образом, чтобы:

(-0.104 * 0.183) (-0.047 * 0.366) (-0.046 * 0.456)

Затем я снова возвращаюсь к умножению каждого элемента в a на соответствующий элемент во втором подсписке b , такой, что:

(-0.104 * 0.971) (-0.047 * 0.156) (-0.046 * 0.856)

Результатом должно быть 2 элемента. Итак, я реализовал свой собственный код с использованием Python, но, к сожалению, код работал некорректно.

Итак, мне нужна помощь, чтобы исправить ошибку в моем коде.

Код приведен ниже:

 a= [[-0.104],[-0.047],[-0.046]]

b= [[0.183, 0.366, 0.456], [0.971, 0.156, 0.856]]

sumR=0
res2=[]

for i in range(0, len(a)):
    for j in range(0, len(b[0])):
        for k in range(j):
            r= (a[i][j]*b[k][j])
            sumR=sumR r
    res2.append(round(sumR,6))
print(res2)
  

Ответ №1:

Ваш вопрос является чем-то общим для программистов, переходящих на Python с другого языка.

Попробуйте использовать сильные стороны Python вместо написания C / Java / чего угодно на Python:

 xss = [[-0.104],[-0.047],[-0.046]]
yss = [[0.183, 0.366, 0.456], [0.971, 0.156, 0.856]]

answers = [sum([xs[0] * y for xs, y in zip(xss, ys)]) for ys in yss]
print(answers)
  

(или, если вы не возражаете против использования дополнительных преимуществ Python, то есть множества его отличных сторонних библиотек, используйте что-то вроде numpy, как предлагает @GilPinsky)

Небольшое объяснение понимания списка: что-то вроде [ys for ys in yss] заставляет Python выполнять цикл yss , присваивая каждое значение yss ys по очереди, собирая результаты в список. Вы, конечно, можете применить операцию к ys , чтобы сделать ее полезной.

zip(xss, ys) связывает каждый элемент из xss с элементом из ys и возвращает итерацию. [xs, y for in zip(xss, ys)] вы получите список всех кортежей из этой комбинации. И таким образом sum([xs[0] * y for xs, y in zip(xss, ys)]) вы получаете сумму всех произведений каждой пары из xss и ys . Это имеет место, xs[0] потому что элементы из xss сами по себе являются списками, и вас интересует только первый элемент каждого.

Я переименовал переменные, чтобы немного упростить отслеживание того, что к чему. x это просто некоторое значение, xs это список из нескольких значений, xss это список таких списков и т.д. — аналогично для y и ys .

Ответ №2:

Не уверен, что это тот ответ, который вы ищете: [-0.05721, -0.147692]

 
    a= [[-0.104],[-0.047],[-0.046]]
    
    b= [[0.183, 0.366, 0.456], [0.971, 0.156, 0.856]]
    
    sumR=0
    res2=[]
    for i in range(0, len(b)):
        sumR = 0
        for j in range(0, len(a)):
          # every list in a as only 1 element
          r= (a[j][0]*b[i][j])
    
          # print(a[j][0],b[i][j],end = "   ")
          sumR=sumR r
         #print()
        res2.append(round(sumR,6))
    print(res2)

  

Раскомментируйте операторы печати, чтобы увидеть, как происходит вычисление

Комментарии:

1. Да, это результат, который должен быть получен.. большое спасибо, теперь программа работает хорошо :))

Ответ №3:

Лучшим решением будет не использовать циклы в этом случае. Обратите внимание, что то, что вы пытаетесь реализовать, — это умножение матрицы на вектор, поэтому вы можете использовать numpy для эффективного выполнения этого следующим образом:

 import numpy as np

a = np.array([[-0.104], [-0.047], [-0.046]])
b = np.array([[0.183, 0.366, 0.456], [0.971, 0.156, 0.856]])
res2 = (b @ a).tolist()