2011-03-18 12 views
8

Tengo una serie unidimensional NumPy:¿Cómo puedo obtener el producto de todos los elementos en una una matriz tridimensional numpy

a = numpy.array([2,3,3]) 

me gustaría tener el producto de todos los elementos, 18 en este caso.

La única manera que pude encontrar para hacer esto sería:

b = reduce(lambda x,y: x*y, a) 

que se ve bonito, pero no es muy rápido (tengo que hacer esto mucho).

¿Hay algún método numpy que hace esto? Si no, ¿cuál es la forma más eficiente de hacer esto? Mis arreglos de mundo real tienen 39 elementos flotantes.

Respuesta

13

En NumPy que puede probar:

numpy.prod(a) 

desea un número mayor numpy.arange(1,40)/10.:

array([ 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. , 1.1, 
     1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2. , 2.1, 2.2, 
     2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3. , 3.1, 3.2, 3.3, 
     3.4, 3.5, 3.6, 3.7, 3.8, 3.9]) 

sus necesidades reduce(lambda x,y: x*y, a) 24.2μs,

numpy.prod(a) necesidades 3.9μs.

EDIT:a.prod() necesita 2.67μs. ¡Gracias a J.F. Sebastian!

+0

A, numpy.prod(), que es lo que estaba buscando. ¡Gracias! –

+5

['a.prod()' es un poco más rápido que 'np.prod (a)'] (https://gist.github.com/875795) – jfs

0

O si la pérdida de precisión numérica no es un problema, podemos hacer

>>> numpy.exp(numpy.sum(numpy.log(a))) 
17.999999999999996 

>>> numpy.prod(a) 
18 
+0

¿por qué no usar 'numpy.sum'? – MSeifert

+0

@MSeifert gracias 'numpy.sum' sería mejor, solo quería guardar algunos caracteres: P – dontloo

Cuestiones relacionadas