J'ai deux listes, l'une est nommée A, une autre est nommée B. Chaque élément de A est un triple et chaque élément de B est simplement un nombre. Je voudrais calculer le résultat défini comme:
résultat = A [0] [0] * B [0] + A [1] [0] * B [1] + ... + A [n-1] [0] * B [n-1]
Je sais que la logique est facile mais comment écrire en Pythonic?
Merci!
import numpy
result = numpy.dot( numpy.array(A)[:,0], B)
http://docs.scipy.org/doc/numpy/reference/
Si vous voulez le faire sans numpy, essayez
sum( [a[i][0]*b[i] for i in range(len(b))] )
Python 3.5 a un opérateur explicite @
pour le produit scalaire, Vous pouvez donc écrire
a = A @ B
au lieu de
a = numpy.dot(A,B)
from operator import mul
sum(map(mul, A, B))
Mon produit ponctuel Pythonic préféré est:
sum([i*j for (i, j) in Zip(list1, list2)])
Donc, pour votre cas, nous pourrions faire:
sum([i*j for (i, j) in Zip([K[0] for K in A], B)])
Utilisation des modules operator et itertools:
from operator import mul
from itertools import imap
sum(imap(mul, A, B))
La manière la plus pythonique de ce genre de choses est probablement d’utiliser numpy . ;-)
>>> 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
Et c'est tout.
Cela pourrait être une solution répétée, cependant:
>>> u = [(1, 2, 3), (4, 5, 6)]
>>> v = [3, 7]
En clair Python
:
>>> sum([x*y for (x, *x2), y in Zip(u,v)])
31
Ou utilisez numpy
(comme décrit dans la réponse de user57368 :):
import numpy as np
>>> np.dot(np.array(u)[:,0], v)
31
Toutes les réponses ci-dessus sont correctes, mais à mon avis le moyen le plus pythonique de calculer le produit scalaire est:
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> sum(map(lambda pair:pair[0]*pair[1],Zip(a,b)))
32
Utilisation de more_itertools
, une bibliothèque tierce qui implémente la recette dotproduct
itertools :
import more_itertools as mit
a = [1, 2, 3]
b = [7, 8, 9]
mit.dotproduct(a, b)
# 50