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