Кажется, я нашел ловушку с использованием .sum()
на массивах numpy
, но я не могу найти объяснения. По сути, если я попытаюсь суммировать большой массив, тогда я начинаю получать бессмысленные ответы, но это происходит без звука, и я не могу понять, насколько результат достаточно для Google.numpy.sum() дает странные результаты на больших массивах
Например, это работает точно так же, как и ожидалось:
a = sum(xrange(2000))
print('a is {}'.format(a))
b = np.arange(2000).sum()
print('b is {}'.format(b))
Давать тот же результат для обоих:
a is 1999000
b is 1999000
Однако, это не работает:
c = sum(xrange(200000))
print('c is {}'.format(c))
d = np.arange(200000).sum()
print('d is {}'.format(d))
Отдавая следующий результат:
c is 19999900000
d is -1474936480
И на еще большем массиве можно получить положительный результат. Это более коварно, потому что я не могу определить, что что-то необычное происходит вообще. Например это:
e = sum(xrange(100000000))
print('e is {}'.format(e))
f = np.arange(100000000).sum()
print('f is {}'.format(f))
дает это:
e is 4999999950000000
f is 887459712
Я догадался, что это было связано с типами данных и в самом деле, даже с помощью питона float
кажется, чтобы исправить эту проблему:
e = sum(xrange(100000000))
print('e is {}'.format(e))
f = np.arange(100000000, dtype=float).sum()
print('f is {}'.format(f))
Предоставление:
e is 4999999950000000
f is 4.99999995e+15
У меня нет фона в Comp. Sci. и оказался застрявшим (возможно, это обман). Вещи, которые я пробовал:
numpy
массивы имеют фиксированный размер. Неа; this, похоже, я должен сначала нажатьMemoryError
.- Возможно, у меня может быть 32-разрядная установка (возможно, не актуальна); Нет, я последовал за this и подтвердил, что у меня 64-разрядная версия.
- Другие примеры странных
sum
поведение; nope (?) Я нашел this, но я не вижу, как это применимо.
Может кто-нибудь, пожалуйста, кратко объясните, что мне не хватает, и скажите мне, что мне нужно для чтения? Кроме того, за исключением того, что каждый раз задавать dtype
, есть ли способ остановить это или дать предупреждение?
Возможно отношение:
Windows 7
numpy
1.11.3
Исчерпывание Enthought Навес на Python 2.7.9
вероятно потому, что 'numpy' целые полагаться на целых C-типа, тогда как python имеет неограниченный целочисленный диапазон. Поплавки ... плавают. Они могут быть очень высокими. –
Проверьте 'np.arange (5) .dtype'. Вероятно, он использует 32-битные целые числа вместо 64-битных. Кроме того, убедитесь, что вы выполняете все эти проверки на одной и той же установке Python. – user2357112
Похоже, что-то вроде переполнения ... Знак целого числа, похоже, также перезаписывается, что может быть причиной того, что иногда вы получаете отрицательные результаты. – keksnicoh