0
votes

Somme de produit cumulée pour le tableau numpy

J'étais curieux de savoir s'il existait un moyen rapide de calculer la somme cumulée du produit pour un tableau donné en Python. Je comprends que numpy a à la fois les fonctions cumsum et cumprod , mais aucune ne semble fonctionner en conjonction avec mon cas. Ma séquence itérative est la suivante, où t est un index temporel:

X_ {t + 1} = X_ {t} * (B_ {t + 1} - B_ {t}) + X_t

Toutes les suggestions seraient grandement appréciées.


4 commentaires

Votre question est de rendre X étant donné B et la valeur initiale de X (X_1). Est-ce correct?


Étant donné une valeur initiale de X au temps t , la séquence pour chaque terme par la suite est définie comme le produit de X au temps t et la différence de deux termes B, plus la valeur X au temps t


Le vecteur B entier est-il connu? Sinon, il n'y a pas assez d'informations pour calculer X_t.


le vecteur B entier est connu, le vecteur X n'est connu qu'à partir de l'initialisation t = 0


3 Réponses :


0
votes

Essaye ça. Puisque X_2, X_3, .... doivent être calculés à chaque fois, la boucle doit être utilisée, mais B_diff ([B_2-B_1, B_3-B_2, ...]) est calculé efficacement par avance.

def make_X(initial_X, B):
    B_diff = B[1:] - B[:-1] + 1
    X = [initial_X]
    for t in range(len(B_diff)):
        next_X = B_diff[t] * X[-1]
        X.append(next_X)
    return X

# Test 
make_X(1, np.array([1, 2, 3, 4]))


1 commentaires

J'avais déjà quelque chose de similaire, j'espérais qu'il y avait une méthode de tableau rapide à mettre en œuvre. Merci, de toute façon tho



0
votes

Finalement, j'ai décidé de travailler avec une fonction personnalisée numpy apply, car je dois l'utiliser dans une matrice:

# for calculating the series
def myFunc(arr:np.array, initial:int, size:int):
    temp = initial
    new_arr = [0]*size
    for i in range(size):
        new_arr[i] = temp + (temp * arr[i])
        temp += temp * arr[i]
    return np.array(new_arr) 

# for implementing it across my matrix 
np.apply_along_axis(myFunc, 0, arr, initial, size)


1 commentaires

apply_along_axis peut être pratique dans ce cas, mais ce n'est pas une amélioration de la vitesse (sur une boucle plus explicite).



3
votes

Dans cette solution, je suppose que le vecteur B est connu. L'équation pour X peut être simplifiée comme suit

import numpy as np

# provide for B and X_0 yourself.

C = B[1:] - B[:-1] + 1
X = np.cumprod(C) * X_0   # compute the entire X vector at once.
X_5 = np.prod(C[:5]) * X_0 # compute X_5 only

Maintenant, l'équation dynamique est

X_n = C_(n-1) ... C_0 X_0

Observez le comportement de l'équation

X_1 = C_0 X_0
X_2 = C_1 C_0 X_0
X_3 = C_2 C_1 C_0 X_0

À partir du modèle ci-dessus, nous obtenons

X_(t+1) = C_t X_t

Cela signifie que si vous êtes juste après un état particulier, vous n'avez pas besoin de calculer explicitement chaque état précédent. Pour obtenir le produit des éléments dans un tableau numpy, utilisez simplement numpy.prod . L'extrait ci-dessous montre comment calculer X pour un point donné et comment calculer X à toutes les valeurs pour t

X_(t+1) = (B_(t+1) - B_t) X_t + X_t
X_(t+1) = ((B_(t+1) - B_t) + 1) X_t

let C = B[1:] - B[:-1] + 1.

C'est ça! pas de boucle ou de récursivité explicite.


2 commentaires

Bien vu. + 1


Il doit être C = B[1:] - B[:-1] + 1 . B[:-2] supprimera les 2 derniers éléments