#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()