2016-06-07 3 views

ответ

2

В чистом Python попробуйте ввести вложенный список/генератор:

>>> [sum(ai * bi for ai, bi in zip(a, b)) 
... for a, b in zip(A, B)] 
[2, 0] 

или NumPy, вы можете сделать поэлементное произведение 2-мерных массивов, а затем суммы по каждой строке:

>>> import numpy as np 
>>> np.multiply(A, B).sum(1) 
array([2, 0]) 

Заметим, что решение NumPy будет работать только тогда, когда все векторы имеют одинаковую длину - каждый список векторов неявно преобразуется в двумерную матрицу.

1

Мы можем использовать проносясь, суммируя и списковых для фантазии однострочника:

A = [(1,1,1), (0,1,1)] 
B = [(1,0,1), (1,0,0)] 
C = [sum(i*j for i, j in zip(a, b)) for a, b in zip(A, B)] 
print(C) # [2, 0] 
0

Попробуйте это:

[sum([y*z for y, z in zip(*x)]) for x in zip(A, B)] 

Это дает:

[2, 0] 
0
def dot_product(vector_a, vector_b): 
    vector_c = (vector_a[0]*vector_b[0],vector_a[1]*vector_b[1],vector_a[2]*vector_b[2]) #vector multiplication 
    return sum(vector_c) #sum of each chord in the new vector 
c = [dot_product(a[0],a[1]), dot_product(b[0],b[1])] 
1

Для достаточно больших массивов, самый быстрый метод здесь является einsum

A = numpy.array(A) 
B = numpy.array(B) 

out = numpy.einsum('ij, ij->i', A, B) 
out = numpy.multiply(A, B).sum(1) 
out = [sum(ai * bi for ai, bi in zip(a, b)) for a, b in zip(A, B)] 

Он превосходит версию с множественным добавлением в 2 раза; версия для ознакомления в списке - несколько сотен раз медленнее.

enter image description here

На рисунке был создан с

import numpy 
import perfplot 

perfplot.show(
    setup=lambda n: (numpy.random.rand(n, 3), numpy.random.rand(n, 3)), 
    kernels=[ 
     lambda data: numpy.einsum('ij, ij->i', data[0], data[1]), 
     lambda data: numpy.multiply(data[0], data[1]).sum(1), 
     lambda data: [sum(ai * bi for ai, bi in zip(a, b)) for a, b in 
      zip(data[0], data[1])], 
     ], 
    labels=['einsum', 'multiply+sum', 'sum+zip'], 
    n_range=[2**k for k in range(18)], 
    xlabel='len(a)', 
    logx=True, 
    logy=True, 
    ) 
Смежные вопросы