es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

“`

Tags:  , , , ,

Answer

  1. Avatar for 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ón np.split para dividir el array de entrada correspondientemente. Finalmente, podemos aplicar la función np.sum a lo largo del eje de las particiones para obtener el resultado deseado.

    Aquí está la versión de NumPy del ejemplo anterior:

    a = np.arange(20) # Array de entrada
    idxs = np.array([7, 15, 16]) # Array de índices
    
    # Obtener las longitudes de las particiones
    lengths = np.diff(np.concatenate(([0], idxs, [a.size])))
    
    # Dividir a en los índices definidos en idxs
    split_a = np.split(a, idxs)
    
    # Calcular la suma para cada partición
    result = np.array([np.sum(split_a[i]) for i in range(len(split_a))])
    
    # Resultado: array([21, 84, 15, 70])
    

    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ón np.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.]).

Comments are closed.