Умножение двух положительных чисел дает отрицательный результат в Python 3
у меня есть фрейм данных df1 : 
df1.head() = 
             wght          num_links 
id_y  id_x                      
 3     133   0.000203          2      
       186   0.000203          2 
 5     6     0.000203          2      
       98    0.000203          2      
       184   0.000203          2
мне нужно вычислить переменную под названием thr, 
thr = N*(N-1)*2,
здесь Nколичество строк df1.
проблема в том, что когда я расчета thr,Python выдает отрицательное значение (хотя все входные данные положительные):
ipdb> df1['wght'].count()*(df1['wght'].count()-1)*2
-712569744 
возможный намек
количество строк N is
ipdb> df1['wght'].count() 
137736 
таким образом,
ipdb> 137736*137735*2
37942135920.
учитывая, что максимальное значение, которое может быть назначено int32 is 2147483647, я подозреваю, что NumPy считает type(thr) = <int32>, когда он должен быть!--14-->. Это имеет смысл?  
обратите внимание, что я не написал код, который создает df1, потому что
ipdb> df1['wght'].count() 
137736
однако, если это необходимо для воспроизведения ошибки, дайте мне знать.
спасибо заранее.
3 ответов
вы испытываете np.int32 переполнение, поэтому просто используйте len(df) вместо df.column.count().
вот небольшая демонстрация:
In [149]: x = pd.DataFrame(np.random.randint(0,100,size=(137736, 3)), columns=list('ABC'))
In [150]: x.A.count() * (x.A.count() - 1) * 2
Out[150]: -712569744
In [151]: len(x) * (len(x) - 1) * 2
Out[151]: 37942135920
In [153]: type(x.A.count())
Out[153]: numpy.int32
In [154]: type(len(x))
Out[154]: int
если вы получаете типа count() (т. е. type(df1['wght'].count())) вы получите:
<class 'numpy.int32'>
поэтому попробуйте свои вычисления с помощью:
n = df1['wght'].count().astype(np.int64)
n*(n-1)*2
вы можете пройти df1['wght'].count() для длинного конструктора, как это, чтобы убедиться, что он длинный.
N = long(df1['wght'].count())
хотя сохранение в любой переменной
N = df1['wght'].count() 
должен работать, поскольку класс int имеет __mul__ метод (который реализует *), который при необходимости создает длинный результат.
Также Python 3.x имеет "унифицированный" int и long, который также заботится об ошибке.
