私は次のコードを持っています:
import numpy
def numpysum(n):
a = numpy.arange(n) ** 2
b = numpy.arange(n) ** 3
c = a + b
return c
size = 3000
c = numpysum(size)
実行すると、次のエラーが発生します。
D:\ Work\Programming\python\test_1\src\test1_numpy.py:6:RuntimeWarning:電源b = numpy.arange(n)** 3で無効な値が検出されました
次のnumpyless関数は正常に機能することに注意してください。
def pythonsum(n):
a = list(range(n))
b = list(range(n))
c = []
for i in range(len(a)):
a[i] = i ** 2
b[i] = i ** 3
c.append(a[i] + b[i])
return c
大きな数を3の累乗に上げようとしているからだと思います。浮動小数点数を扱う以外に何ができますか?
私はPython 3.2で作業しています。
numpyは実際にこれであなたを探しています。標準のPythonでは、その整数演算は任意精度のオブジェクトでは機能しません。同じ操作がオーバーフローしないので、32ビットのPythonを実行していたと思います。
>>> 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])
ビット数が増えると状況は改善します。 Python任意のサイズの整数でnumpy配列操作が本当に必要な場合は、dtypeをオブジェクトに設定できます。
>>> numpy.arange(10, dtype=object)**20
array([0, 1, 1048576, 3486784401, 1099511627776, 95367431640625,
3656158440062976, 79792266297612001, 1152921504606846976,
12157665459056928801], dtype=object)