谁能解释一下?我正在使用 Python 2.5
考虑 1*3*5*7*9*11 ... *49。如果您在 IPython(x,y) 交互式控制台中键入所有这些内容,您将得到 58435841445947272053455474390625L,这是正确的。 (为什么是奇数:就像我最初做的那样)
Python multiply.reduce() 或 prod() 应该在等效范围内产生相同的结果。在一定程度上确实如此。这里,已经错了:
: k = range(1, 50, 2)
: multiply.reduce(k)
: -108792223
使用 prod(k) 也会生成 -108792223 作为结果。对于长度为 12 的等效范围(即 k = 范围 (1,24,2)),开始出现其他不正确的结果。
我不确定为什么。谁能帮忙?
请您参考如下方法:
这是因为numpy.multiply.reduce()将范围列表转换为类型为numpy.int32的数组,reduce操作溢出了可以存储的内容在某些时候是 32 位:
>>> type(numpy.multiply.reduce(range(1, 50, 2)))
<type 'numpy.int32'>
正如 Mike Graham 所说,您可以使用 dtype 参数来使用 Python 整数而不是默认值:
>>> res = numpy.multiply.reduce(range(1, 50, 2), dtype=object)
>>> res
58435841445947272053455474390625L
>>> type(res)
<type 'long'>
但是在这种情况下使用 numpy 来处理 python 对象是没有意义的,最好的解决方案是 KennyTM 的:
>>> import functools, operator
>>> functools.reduce(operator.mul, range(1, 50, 2))
58435841445947272053455474390625L
