Ответ 1
numpy на самом деле ищет вас на этом. Unlke в стандартном Python, его целые операции не работают на объектах с произвольной точностью. Я бы предположил, что вы используете 32-битный питон, потому что для меня не переполняются те же операции:
>>> sys.maxsize
9223372036854775807
>>> size = 3000
>>> c = numpysum(size)
>>>
но они в конечном итоге. Еще проще увидеть, управляете ли вы размером вручную:
>>> numpy.arange(10, dtype=numpy.int8)**10
__main__:1: RuntimeWarning: invalid value encountered in power
array([ 0, 1, 0, -87, 0, -7, 0, -15, 0, 0], dtype=int8)
>>> numpy.arange(10, dtype=numpy.int16)**10
array([ 0, 1, 1024, -6487, 0, 761, -23552, 15089,
0, 0], dtype=int16)
>>> numpy.arange(10, dtype=numpy.int32)**10
array([ 0, 1, 1024, 59049, 1048576,
9765625, 60466176, 282475249, 1073741824, -2147483648], dtype=int32)
>>> numpy.arange(10, dtype=numpy.int64)**10
array([ 0, 1, 1024, 59049, 1048576,
9765625, 60466176, 282475249, 1073741824, 3486784401])
когда ситуация улучшается по мере увеличения количества бит. Если вам действительно нужны операции массива numpy на произвольных размерах Python, вы можете установить dtype для объекта:
>>> numpy.arange(10, dtype=object)**20
array([0, 1, 1048576, 3486784401, 1099511627776, 95367431640625,
3656158440062976, 79792266297612001, 1152921504606846976,
12157665459056928801], dtype=object)