Estoy tratando de descubrir cómo calcular de la manera más eficiente (con NumPy) la siguiente expresión para un ndarray 1D (en este caso, f ):

enter image description here

Imagino que podría hacer algo como:

f = [ 1, 3, 2, 3, 7, 5, 2]
for i in range(0, len(f-1)):
    for j in range(0, len(f-2)):
        ...

Pero eso significaría que tendré que tener un bucle condicional para cada elemento de la lista, si lo entiendo correctamente. ¿Hay una mejor manera de hacer esto?

Gracias de antemano por cualquier consejo!

2
Joker 27 ago. 2020 a las 15:19

3 respuestas

La mejor respuesta

Puede aprovechar la transmisión de numpy:

f = np.array([ 1, 3, 2, 3, 7, 5, 2])
np.triu(f[:,None]-f).sum()

O igualmente:

np.tril(f-f[:,None]).sum()

Salida:

-24
4
Ehsan 27 ago. 2020 a las 12:27

Podrías probar este

f = [ 1, 2, 3, 4]
combined = 0
for i in range(0, len(f)):
    for j in range(i+1, len(f)):
        combined += f[i]-f[j]

Usas i como el punto de partida de tu bucle interno. De esta manera, no necesita las condiciones if.

1
en_lorithai 27 ago. 2020 a las 12:42

Esto no usa Numpy, pero si lo desea, simplemente puede usar la división de listas y hacer algo como esto

def partial_sum(lst,i, j):
    return sum(lst[i:j])
0
Alex 27 ago. 2020 a las 12:34
63615852