Суммирование длинного (> 20 миллионов элементов) массива в Python NumPy - PullRequest
8 голосов
/ 22 декабря 2011

Я новичок в python и numpy, поэтому, пожалуйста, извините, если эта проблема настолько элементарна! У меня есть массив отрицательных значений (это отсортировано):

>>>neg
[ -1.53507843e+02  -1.53200012e+02  -1.43161987e+02 ...,  -6.37326136e-1 -3.97518490e-10  -3.73480691e-10]
>>>neg.shape
(12922508,)

Мне нужно добавить этот массив в его дубликат (но с положительными значениями), чтобы найти стандартное отклонение распределения, усредненное до нуля. Поэтому я делаю следующее:

>>>pos=-1*neg
>>>pos=pos[::-1] #Just to make it look symmetric for the display bellow!
>>>total=np.hstack((neg,pos))
>>>total
[-153.50784302 -153.20001221 -143.1619873  ...,  143.1619873   153.20001221  153.50784302]
>>>total.shape
(25845016,)

Пока все очень хорошо, но странно то, что сумма этого нового массива не равна нулю:

>>>numpy.sum(total)
11610.6

Стандартное отклонение также совсем не то, что я ожидал, но я думаю, корень этой проблемы такой же, как этот: почему сумма не приводит к нулю?

Когда я применяю этот метод к небольшому массиву; например [-5, -3, -2] сумма становится нулевой. Поэтому я думаю, что проблема заключается в длине массива (более 20 миллионов элементов). Есть ли способ решить эту проблему?

Если бы кто-нибудь мог помочь мне в этом, я был бы очень признателен.

1 Ответ

3 голосов
/ 22 декабря 2011

Как отмечается в комментариях, вы получаете проблемы округления числа с плавающей запятой при суммировании многих миллионов чисел с одинаковыми знаками. Одним из возможных путей решения этой проблемы может быть смешивание положительных и отрицательных чисел в объединенном массиве, чтобы любые промежуточные результаты при суммировании всегда оставались примерно в одном и том же порядке:

neg = -100*numpy.random.rand(20e6)
pos = -neg
combined = numpy.zeros(len(neg)+len(pos))
combined[::2] = neg
combined[1::2] = pos

Теперь combined.sum() должно быть довольно близко к нулю.

Возможно, этот подход также поможет повысить точность вычисления стандартного отклонения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...