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.
3 Réponses :
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]))
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
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)
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).
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.
Bien vu. + 1
Il doit être C = B[1:] - B[:-1] + 1 . B[:-2] supprimera les 2 derniers éléments
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