Suma numérica a lo largo de índices desunidos

Tengo una aplicación donde necesito sumr a través de grupos arbitrarios de índices en una matriz 3D NumPy. La rutina de sum de matriz NumPy integrada resume todos los índices a lo largo de una de las dimensiones de un ndarray. En su lugar, necesito sumr rangos de índices a lo largo de una de las dimensiones de mi matriz y devolver una nueva matriz.

Por ejemplo, supongamos que tengo un ndarray con forma (70,25,3) . Deseo resumir la primera dimensión a lo largo de ciertos rangos de índice y devolver una nueva matriz 3D. Considere la sum de 0:25, 25:50 y 50:75 que devolvería una matriz de forma (3,25,3) .

¿Hay una manera fácil de hacer “sums disjuntas” a lo largo de una dimensión de una matriz NumPy para producir este resultado?

Puede usar np.add.reduceat como un enfoque general de este problema. Esto funciona incluso si los rangos no son todos de la misma longitud.

Para sumr los segmentos 0:25 , 25:50 y 50:75 largo del eje 0, pase los índices [0, 25, 50] :

 np.add.reduceat(a, [0, 25, 50], axis=0) 

Este método también se puede utilizar para sumr rangos no contiguos. Por ejemplo, para sumr los segmentos 0:25 , 37:47 y 51:75 , escriba:

 np.add.reduceat(a, [0,25, 37,47, 51], axis=0)[::2] 

Un enfoque alternativo para sumr rangos de la misma longitud es remodelar la matriz y luego sumr a lo largo de un eje. El equivalente al primer ejemplo anterior sería:

 a.reshape(3, a.shape[0]//3, a.shape[1], a.shape[2]).sum(axis=1) 

Solo sum cada porción y usa los resultados para crear una nueva matriz.

 import numpy as np i1, i2 = (2,7) a = np.ones((10,5,3)) b = np.sum(a[0:i1,...], 0) c = np.sum(a[i1:i2,...], 0) d = np.sum(a[i2:,...], 0) g = np.array([b,c,d]) >>> g.shape (3, 5, 3) >>> g array([[[ 2., 2., 2.], [ 2., 2., 2.], [ 2., 2., 2.], [ 2., 2., 2.], [ 2., 2., 2.]], [[ 5., 5., 5.], [ 5., 5., 5.], [ 5., 5., 5.], [ 5., 5., 5.], [ 5., 5., 5.]], [[ 3., 3., 3.], [ 3., 3., 3.], [ 3., 3., 3.], [ 3., 3., 3.], [ 3., 3., 3.]]]) >>> 

Puede usar np.split para dividir su matriz y luego usar np.sum para sumr sus elementos a lo largo del segundo eje:

 np.sum(np.split(my_array,3),axis=1) 

Manifestación:

 >>> a=np.arange(270).reshape(30,3,3) >>> np.sum(np.split(a,3),axis=1) array([[[ 405, 415, 425], [ 435, 445, 455], [ 465, 475, 485]], [[1305, 1315, 1325], [1335, 1345, 1355], [1365, 1375, 1385]], [[2205, 2215, 2225], [2235, 2245, 2255], [2265, 2275, 2285]]]) 

También tenga en cuenta que si tiene una longitud de corte diferente, puede pasar el final de sus cortes a la función np.split :

 >>> new=np.sum(np.split(a,[10,20,]),axis=1) >>> new array([[[ 405, 415, 425], [ 435, 445, 455], [ 465, 475, 485]], [[1305, 1315, 1325], [1335, 1345, 1355], [1365, 1375, 1385]], [[2205, 2215, 2225], [2235, 2245, 2255], [2265, 2275, 2285]]])