如何解决为什么递归加法在python中产生负数?
我一直在研究Python中的一个函数,该函数查找数组中所有元素从其各自的索引到数组开头的总和。
例:
输入:[2,14,17,36]
输出:[2,14+2,17+14+2,36+17+14+2]
这是代码。
import matplotlib.pyplot as plt
import numpy as np
arr = []
a = np.array([2,4,1,5,5])
def rolling_sum(x):
total = 0
values = []
for i,j in enumerate(x):
total = total+j
values.append(total)
if total <= 2000000000:
arr.append(values)
return rolling_sum(values)
else:
return values
rolling_sum(a)
for i in arr:
plt.plot(i)
检查arr
变量会发现其中有负数,甚至可以从图中清楚地看到它。请为什么这样呢?
这就是我的图的样子
image
解决方法
与具有无限大小的常规Python int64
类型相比,NumPy数组使用固定大小的整数类型(例如int
)。
它们具有可以表示的最大值。尝试添加一个大于该最大值的值会导致溢出,对于带符号整数类型,这很可能导致值为负。
请参见Often big numbers become negative
例如,int32
类型的最大值是2 31 −1 = 2147483647,对其加1得出的最小值是-2 31 = -2147483648。对于int64
类型,这些值要大得多; 9223372036854775807和−9223372036854775808根据您的实现(即,默认情况下NumPy使用哪种类型)和您使用的输入,您可能会或可能不会看到此行为。
在您的情况下,与Python列表相比,您似乎没有使用NumPy数组提供的任何功能,因此您可以只使用a = [2,4,1,5,5]
并依靠Python为您处理无限的大整数。
执行代码时,请注意警告:
RuntimeWarning: overflow encountered in long_scalars
total = total+j
这是因为numpy
有时默认为np.int32
(取决于操作系统是32/64位,而已安装的Python解释器是32/64位,显然是较低的)。在这种情况下,大量数字将溢出,因此它们会包裹负数。
这很容易解决,只需提供dtype=np.int64
:
a = np.array([2,5],dtype=np.int64)
可以通过添加以下内容来确认:
from itertools import chain
print(len(list(filter(lambda n: n < 0,chain.from_iterable(arr)))))
这使arr
变平并计算有多少个负数。使用原始代码,输出为
RuntimeWarning: overflow encountered in long_scalars
total = total+j
5
添加dtype=np.int64
后的输出为
0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。