Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Euler#101项目-如何解决numpy多项式溢出问题?_Python_Numpy - Fatal编程技术网

Python Euler#101项目-如何解决numpy多项式溢出问题?

Python Euler#101项目-如何解决numpy多项式溢出问题?,python,numpy,Python,Numpy,我刚开始学习Numpy,到目前为止我觉得它很简单 我遇到的一件事是,当我计算多项式时,结果是int32,因此会发生溢出 u = numpy.poly1d([1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1]) for i in xrange(1, 11): print(i, u(i)) 结果是: (1, 1) (2, 683) (3, 44287) (4, 838861) (5, 8138021) (6, 51828151) (7, 247165843) (8,

我刚开始学习Numpy,到目前为止我觉得它很简单

我遇到的一件事是,当我计算多项式时,结果是int32,因此会发生溢出

u = numpy.poly1d([1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1])
for i in xrange(1, 11):
    print(i, u(i))
结果是:

(1, 1)
(2, 683)
(3, 44287)
(4, 838861)
(5, 8138021)
(6, 51828151)
(7, 247165843)
(8, 954437177)
(9, -1156861335)
(10, 500974499)
最后两项显然是错误的

我能想到的解决办法是将系数乘以100

u = numpy.poly1d([0.01, -0.01, 0.01, -0.01, 0.01, -0.01, 0.01, -0.01, 0.01, -0.01, 0.01])
for i in xrange(1, 11):
    print(i, int(u(i) * 100))
这次的结果是正确的

(1, 1)
(2, 682)
(3, 44286)
(4, 838860)
(5, 8138020)
(6, 51828151)
(7, 247165843)
(8, 954437177)
(9, 3138105961L)
(10, 9090909091L)

有更好的办法吗?Numpy允许我更改数据类型吗?谢谢。

并不是100的缩放有帮助,而是给定的数字是浮点数而不是整数,因此具有更高的范围。由于采用浮点计算,正如您所看到的,计算中会引入一些不精确之处

您可以手动指定类型,如下所示:

u = numpy.poly1d(numpy.array([1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1], dtype=numpy.int64))
此问题的计算适合64位整数,因此这将起作用


支持的类型已列出。

在我写这篇文章时,Interjay给出了一个更好的答案,但我想你可能还是需要一个替代方案

下面是您展示的示例的一个简单实现:

class Poly(object):
    def __init__(self, coefficients):
        assert len(coefficients) > 0
        self.coefficients = coefficients
    def __call__(self, value):
        total = self.coefficients[0]
        for c in self.coefficients[1:]:
            total = total * value + c
        return total
还有一些测试

assert Poly([5])(1) == 5
assert Poly([7])(1) == 7
assert Poly([2,3])(5) == 13
assert Poly([1,0,0,0,0])(-2) == 16
u = Poly([1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1])
for i in range(1, 11):
    print (i, u(i))
而这些都是毫无用处的

assert Poly([2,"!"])("Hello ") == "Hello Hello !"

我在发布后注意到,即使在我的工作中,第3-5项也是不正确的。谢谢,我在谷歌上搜索,发现数组可以有另一种数据类型,但没有意识到poly1d可以接收numpy数组作为参数。