tamaño - qué son las tuplas en python
Python cómo reducir en una lista de tuplas? (5)
Puedo usar map
y sum
para lograr esta funcionalidad, pero ¿cómo usar reduce
?
Hay 2 listas: a
, b
, tienen el mismo número de valores. Quiero calcular
a[0]*b[0]+a[1]*b[1]+...+a[n]*b[n]
La versión de trabajo que escribí usando map
es
value = sum(map(lambda (x,y): x*y, zip(a, b)))
Cómo usar reduce
entonces? Escribí:
value = reduce(lambda (x,y): x[0]*y[0] + x[1]*y[1], zip(a, b)))
Obtuve el error " TypeError: ''float'' object is unsubscriptable
".
¿Alguien puede arrojar algo de luz sobre esto?
El primer argumento de la función lambda es la suma hasta el momento y el segundo argumento es el siguiente par de elementos:
value = reduce(lambda sum, (x, y): sum + x*y, zip(a, b), 0)
Lo haría de esta manera (no creo que necesites lambda) ...
sum(x*y for x, y in zip(a, b))
Esto también parece un poco más explícito. Zip AB, multiplíquelos y resuma los términos.
Una solución que usa reduce
y map
,
from operator import add,mul
a = [1,2,3]
b = [4,5,6]
print reduce(add,map(mul,a,b))
Las dificultades con reduce ocurren cuando tienes un mapa incorrecto.
Tomemos expresión: value = sum(map(lambda (x,y): x*y, zip(a, b)))
Mapa es transformación Necesitamos convertir las tuplas en valores planos simples . En tu caso, se verá así:
map(lambda x: x[0]*x[1], zip(a,b))
Y luego, si desea expresar la sum
través de reduce
, se verá así:
reduce(lambda x,y: x + y, map)
Entonces, aquí hay un ejemplo :
a = [1,2,3]
b = [4,5,6]
l = zip(a,b)
m = map(lambda x: x[0]*x[1], l)
r = reduce(lambda x,y: x + y, m)
parece que quieres un producto interno. usa un producto interno https://docs.scipy.org/doc/numpy/reference/generated/numpy.inner.html
np.inner(a, b) = sum(a[:]*b[:])
Producto interno ordinario para vectores:
a = np.array([1,2,3])
b = np.array([0,1,0])
np.inner(a, b)
salida: 2
Un ejemplo multidimensional:
a = np.arange(24).reshape((2,3,4))
b = np.arange(4)
np.inner(a, b)
salida: array ([[14, 38, 62], [86, 110, 134]])