J'ai travaillé sur une fonction en Python qui trouve la somme de tous les éléments d'un tableau à partir de leurs indices respectifs jusqu'au début du tableau. Exemple: Entrée: [2,14,17,36]

Sortie: [2, 14+2, 17+14+2, 36+17+14+2]

Voici le code.

import matplotlib.pyplot as plt
import numpy as np
arr = []
a = np.array([2, 0, 0, 4, 0, 1, 0, 4, 5, 5])
def rolling_sum(x):
    total = 0
    values = []
    for i,j in enumerate(x):
        total = total+j 
        values.append(total)
    if total <= 2000000000:
        arr.append(values)
        return rolling_sum(values)
    else:
        return values
rolling_sum(a)
for i in arr:
    plt.plot(i)

L'inspection de la variable arr révèle qu'elle contient des nombres négatifs et qu'elle est même clairement indiquée sur le graphique. S'il vous plaît pourquoi est-ce ainsi? Voici à quoi ressemble mon graphique image

0
Tariq Sulley 2 sept. 2020 à 01:27

2 réponses

Meilleure réponse

Lorsque vous exécutez le code, notez l'avertissement:

RuntimeWarning: overflow encountered in long_scalars
    total = total+j

C'est parce que numpy prend parfois la valeur par défaut np.int32 (selon que le système d'exploitation est 32/64 bits et que l'interpréteur Python installé est 32/64 bits, évidemment le plus bas d'entre eux). Dans de tels cas, un grand nombre débordera, donc ils s'enroulent vers les négatifs.

Cela est facilement résolu en fournissant dtype=np.int64:

a = np.array([2, 0, 0, 4, 0, 1, 0, 4, 5, 5], dtype=np.int64)

Cela peut être confirmé en ajoutant:

from itertools import chain

print(len(list(filter(lambda n: n < 0, chain.from_iterable(arr)))))

Cela aplatit arr et compte le nombre de nombres négatifs. Avec le code d'origine, la sortie est

RuntimeWarning: overflow encountered in long_scalars
  total = total+j
5

Après avoir ajouté dtype=np.int64, la sortie est

0
2
DeepSpace 1 sept. 2020 à 23:24

Les tableaux NumPy utilisent un type entier de taille fixe (par exemple int64) contrairement au type Python int normal, qui a une taille illimitée.

Ils ont une valeur maximale qu'ils peuvent représenter. Essayer d'ajouter une valeur qui serait supérieure à cette valeur maximale entraîne un dépassement de capacité, ce qui entraîne probablement une valeur négative pour un type entier signé.

Voir Souvent, les grands nombres deviennent négatifs

Par exemple, la valeur maximale du type int32 est 2 31 −1 = 2147483647, y ajouter 1 donne la valeur minimale, −2 31 = −2147483648. Pour le type int64, ces valeurs sont beaucoup plus grandes; 9223372036854775807 et -9223372036854775808, respectivement. En fonction de votre implémentation (c'est-à-dire du type utilisé par NumPy par défaut) et des entrées que vous utilisez, vous pouvez ou non voir ce comportement.

Dans votre cas, vous ne semblez utiliser aucune des fonctionnalités fournies par un tableau NumPy par rapport à une liste Python, vous pouvez donc simplement utiliser a = [2, 0, 0, 4, 0, 1, 0, 4, 5, 5] et vous fier à Python gérant un nombre illimité de grands entiers pour vous.

2
mkrieger1 1 sept. 2020 à 22:43