Умножение двух положительных чисел дает отрицательный результат в 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, который также заботится об ошибке.