vectorize array python python-3.x numpy vectorization

python - array - numpy vectorize



¿Qué es la vectorización? (2)

¿Qué significa vectorizar bucles for en Python? ¿Hay otra forma de escribir bucles for anidados?

Soy nuevo en Python y, en mi investigación, siempre encuentro la biblioteca NumPy.


Aquí hay una definition de Wes McKinney:

Las matrices son importantes porque le permiten expresar operaciones por lotes en datos sin escribir ninguna para bucles. Esto generalmente se llama vectorización. Cualquier operación aritmética entre matrices de igual tamaño aplica la operación por elementos.

Versión vectorizada:

>>> import numpy as np >>> arr = np.array([[1., 2., 3.], [4., 5., 6.]]) >>> arr * arr array([[ 1., 4., 9.], [ 16., 25., 36.]])

Lo mismo con los bucles en una lista nativa de Python (anidada):

>>> arr = arr.tolist() >>> res = [[0., 0., 0.], [0., 0., 0.]] >>> for idx1, row in enumerate(arr): for idx2, val2 in enumerate(row): res[idx1][idx2] = val2 * val2 >>> res [[1.0, 4.0, 9.0], [16.0, 25.0, 36.0]]

¿Cómo se comparan estas dos operaciones? La versión NumPy toma 436 ns; la versión de Python toma 3.52 µs (3520 ns). Esta gran diferencia en tiempos "pequeños" se llama microperformación, y se vuelve importante cuando se trabaja con datos más grandes o se repiten operaciones miles o millones de veces.


Python for loops es inherentemente más lento que su contraparte C.

Es por eso que numpy ofrece acciones vectorizadas en matrices numpy . Empuja el bucle for que normalmente haría en Python hasta el nivel C, que es mucho más rápido. numpy ofrece numpy vectorizadas ("nivel C for bucle") a las cosas que de otro modo tendrían que hacerse de manera inteligente ("nivel Python for bucle").

import numpy as np from timeit import Timer li = list(range(500000)) nump_arr = np.array(li) def python_for(): return [num + 1 for num in li] def numpy_add(): return nump_arr + 1 print(min(Timer(python_for).repeat(10, 10))) print(min(Timer(numpy_add).repeat(10, 10))) # 0.725692612368003 # 0.010465986942008954

La numpy vectorizada numpy fue x70 veces más rápida.