np.sum y np.add.reduce – en producción, ¿qué usas?

Como fondo, lea esta publicación rápida y la respuesta clara: ¿Cuál es la diferencia entre np.sum y np.add.reduce?

Por lo tanto, para una matriz pequeña, el uso de add.reduce es más rápido. Tomemos el siguiente código con el que experimenté para aprender, que sum una matriz 2D:

 a = np.array([[1,4,6],[3,1,2]]) print('Sum function result =', np.sum(a)) # faster for small array - # print(np.add.reduce(a)) # but the only reduces dimension by 1. So do this repeatedly. I create a copy of x since I keep reducing it: x = np.copy(a) while x.size > 1: x = np.add.reduce(x) print('Sum with add.reduce =', x) 

Entonces, lo anterior parece una exageración: supongo que es mejor usar solo la sum cuando no se conoce el tamaño de su matriz, y definitivamente si es más de una dimensión. ¿Alguien usa add.reduce en el código de producción si su matriz no es obvia / pequeña? Si es así, ¿por qué?

Cualquier comentario para improvisación de código son bienvenidos.

No creo que haya usado np.add.reduce cuando np.sum o arr.sum harían lo mismo. ¿Por qué escribir algo más largo para una aceleración trivial.

Considere una sum de 1 eje en una matriz de tamaño modesto:

 In [299]: arr = np.arange(10000).reshape(100,10,5,2) In [300]: timeit np.sum(arr,axis=0).shape 20.1 µs ± 547 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) In [301]: timeit arr.sum(axis=0).shape 17.6 µs ± 22.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) In [302]: timeit np.add.reduce(arr,axis=0).shape 18 µs ± 300 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) In [303]: 

arr.sum es el más rápido. Obviamente es mejor que np.sum porque hay un nivel menos de llamada de función. np.add.reduce no es más rápido.

El ufunc.reduce tiene su lugar, especialmente para ufunc que no tiene el equivalente de sum o prod . (Parece que he comentado sobre esto recientemente).

Sospecho que encontrará más usos de np.add.at o np.add.reduceat que np.add.reduce en SO respuestas. Esas son construcciones ufunc que no tienen un método equivalente.

O busca una palabra clave como keepdims . Está disponible con las 3 construcciones, pero casi todos los ejemplos lo usarán con sum , no con reduce .

Cuando estaba configurando esas pruebas, encontré una diferencia de la que no estaba al tanto:

 In [307]: np.add.reduce(arr).shape # default axis 0 Out[307]: (10, 5, 2) In [308]: np.sum(arr) # default axis None Out[308]: 49995000 In [309]: arr.sum() Out[309]: 49995000