Oto przykład, który emituje taką samą ostrzeżenie:
import numpy as np
np.seterr(all='warn')
A = np.array([10])
a=A[-1]
a**a
plony
RuntimeWarning: overflow encountered in long_scalars
W powyższym przykładzie to się dzieje, ponieważ a
jest dtype int32
, a maksyma v Zapis alue w pliku int32
to 2 ** 31-1. Od 10**10 > 2**32-1
, potęgowanie skutkuje liczbą większą niż ta, którą można zapisać w postaci int32
.
Należy pamiętać, że nie można polegać na np.seterr(all='warn')
, aby uchwycić wszystkie błędy przepełnienia w numpy. Na przykład, na 32-bitowym NumPy
>>> np.multiply.reduce(np.arange(21)+1)
-1195114496
natomiast na 64-bitowym NumPy:
>>> np.multiply.reduce(np.arange(21)+1)
-4249290049419214848
Zarówno zawieść bez żadnego ostrzeżenia, chociaż jest to również z powodu błędu przepełnienia. Prawidłowa odpowiedź jest taka, że 21! równa
In [47]: import math
In [48]: math.factorial(21)
Out[50]: 51090942171709440000L
According to numpy developer, Robert Kern,
przeciwieństwie do prawdziwych błędów zmiennoprzecinkowych (gdzie FPU sprzętu ustawia flagę kiedy robi operację atomową, która przelewa), musimy wdrożyć wykrywanie całkowitą przepełnienia my sami. Robimy to na skalarach , ale bez tablic, ponieważ byłoby zbyt wolne, aby zaimplementować dla każdej operacji atomowej na tablicach.
Tak więc obciążenie polega na tym, aby wybrać odpowiedni dtypes
, aby żadna operacja nie była przepełniona.
Mógłbyś pokazać [krótki, pełny przykład] (http://sscce.org/), który pokazuje ten problem ? –
Zawarłeś tag numpy. Nic w twoich pytaniach nie sugeruje odrętwienia. Nie podałeś kodu, który pozwala nam odtworzyć błąd. Zrób tak, proszę. –
możliwy duplikat http://stackoverflow.com/questions/3767409/python-warning-possibly-numpy – rocksportrocker