Suma de valores numpy en subarrays entre pares de índices

Supongamos que tengo una matriz A. Tengo una serie de pares de índices (a1, b1), (a2, b2) … (an, bn)

Quiero obtener todas las sums de los elementos entre esos pares. es decir

sum(A[a1:b1]), sum(A[a2:b2]), sum(A[a3:b3]) ... 

En términos de tiempo de ejecución, ¿cuál es la forma más eficiente de hacer esto?

¡Gracias!

    Suponiendo que sus pares de índices se almacenan en una matriz NumPy indices de forma (n, 2) n es bastante grande, probablemente es mejor evitar cualquier bucle de Python:

     c = numpy.r_[0, A.cumsum()][indices] sums = c[:,1] - c[:,0] 

    Aquí hay otra manera:

     a = np.random.rand (3000)
     índices = np.array ([[0,3], [9,20], [5,30], [9,33]])
     sums = np.add.reduceat (a, indices.ravel ()) [:: 2]
    
     afirmar np.all (sums == np.array ([a [i: j] .sum () para i, j en los índices]))
    

    El cumsum arriba es probablemente más eficiente si hay muchos índices.

    Si tiene muchos pares de índices y su matriz es larga, entonces el almacenamiento en caché podría ser una opción. Me gustaría probar un enfoque recursivo como

     CACHE = {} def mysum(a, b): if (a, b) in CACHE: return CACHE[(a, b)] if a >= b: return 0 s = A[a] + mysum(a+1, b) CACHE[(a, b)] = s return s 

    Sin embargo, no se verifica la corrección o la eficiencia. Disminuir el índice superior b podría usarse también.

    En primer lugar probaría la solución directa:

     [np.sum(A[a:b]) for (a,b) in ab] 

    donde ab es la secuencia de pares.

    A[a:b] crea una vista en la matriz; No hay copia de los datos involucrados.

    Si esto resulta ser demasiado lento, díganos más sobre el tamaño de A , cuántos pares de índices espera obtener, si los rangos (a,b) tienden a superponerse, etc.