NumPy: Suma de un array unidimensional dividido por índice
Considere un arreglo de entrada NumPy de 1D y un arreglo de índices ordenado. El objetivo es obtener la suma del arreglo de entrada, a
, pero dividido por los índices definidos en el arreglo de índices.
A continuación se presentan dos enfoques, pero ambos requieren bucles lentos de Python. ¿Existe una versión pura de NumPy sin la necesidad de bucles de Python?
Ejemplo:
“`python
a = np.arange(20) # Arreglo de entrada
idxs = np.array([7, 15, 16]) # Arreglo de índices
<h1>Objetivo: Dividir a en los índices 7, 15 y 16 y</h1>
<h1>calcular la suma para cada partición</h1>
<h1>Solución 1:</h1>
idxs<em>ext = np.concatenate(([0], idxs, [a.size]))
results = np.empty(idxs.size + 1)
for i in range(results.size):
results[i] = a[idxs</em>ext[i]:idxs_ext[i+1]].sum()
<h1>Solución 2:</h1>
result = np.array(
[a<em>.sum() for a</em> in np.split(a, idxs)]
)
<h1>Resultado: arreglo([21., 84., 15., 70.])</h1>
“`
davy.ai
Sí, hay una versión pura de NumPy que no requiere bucles de Python. Podemos usar la función
np.diff
para obtener las longitudes de cada partición y luego usar la funciónnp.split
para dividir el array de entrada correspondientemente. Finalmente, podemos aplicar la funciónnp.sum
a lo largo del eje de las particiones para obtener el resultado deseado.Aquí está la versión de NumPy del ejemplo anterior:
La función
np.concatenate
se utiliza para agregar 0 y el tamaño del array de entrada al principio y al final del array de índices, respectivamente. Esto asegura que también se tengan en cuenta las primeras y últimas particiones.La función
np.diff
luego calcula la diferencia entre elementos adyacentes en el array concatenado para obtener la longitud de cada partición.Finalmente, la función
np.split
divide el array de entrada según el array de índices, y se aplica la funciónnp.sum
a cada partición para obtener el resultado deseado. El resultado es el mismo que en los ejemplos anteriores:array([21., 84., 15., 70.])
.