Подтвердить что ты не робот

Что такое питонический способ вычисления точечного продукта?

У меня есть два списка, один из них называется A, другой - как B. Каждый элемент в является тройным, и каждый элемент в B является просто числом. Я хотел бы вычислить результат, определенный как:

result = A [0] [0] * B [0] + A [1] [0] * B [1] +... + A [n-1] [0] * B [n-1 ]

Я знаю, что логика проста, но как писать питоническим способом?

Спасибо!

4b9b3361

Ответ 1

import numpy
result = numpy.dot( numpy.array(A)[:,0], B)

http://docs.scipy.org/doc/numpy/reference/

Если вы хотите сделать это без numpy, попробуйте

sum( [a[i][0]*b[i] for i in range(len(b))] )

Ответ 2

Python 3.5 имеет явный оператор @ для точечного произведения, поэтому вы можете написать

a = A @ B

вместо

a = numpy.dot(A,B)

Ответ 3

from operator import mul

sum(map(mul, A, B))

Ответ 4

Мой любимый продукт Pythonic dot:

sum([i*j for (i, j) in zip(list1, list2)])


Поэтому для вашего дела мы могли бы сделать:

sum([i*j for (i, j) in zip([K[0] for K in A], B)])

Ответ 5

Использование оператора и модулей itertools:

from operator import mul
from itertools import imap

sum(imap(mul, A, B))

Ответ 6

Вероятно, самый питонический путь для такого рода вещей - использовать numpy.; -)

Ответ 7

>>> X = [2,3,5,7,11]
>>> Y = [13,17,19,23,29]
>>> dot = lambda X, Y: sum(map(lambda x, y: x * y, X, Y))
>>> dot(X, Y)
652

И что это.

Ответ 8

Это может быть повторное решение:

>>> u = [(1, 2, 3), (4, 5, 6)]
>>> v = [3, 7]

В обычном Python:

>>> sum([x*y for (x, *x2), y in zip(u,v)])
31

Или используя numpy (как описано в user57368):

import numpy as np
>>> np.dot(np.array(u)[:,0], v)
31

Ответ 9

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

>>> a=[1,2,3]
>>> b=[4,5,6]
>>> sum(map(lambda pair:pair[0]*pair[1],zip(a,b)))
32

Ответ 10

Используя more_itertools, стороннюю библиотеку, которая реализует dotproduct рецепт itertools:

import more_itertools as mit


a = [1, 2, 3]
b = [7, 8, 9]

mit.dotproduct(a, b)
# 50