2 回答
TA贡献1735条经验 获得超5个赞
当您执行代码时,请注意警告:
RuntimeWarning: overflow encountered in long_scalars
total = total+j
这是因为numpy有时默认为np.int32(取决于操作系统是 32/64 位并且安装的 Python 解释器是 32/64 位,显然是其中较低的一个)。在这种情况下,大量数字会溢出,因此它们会换行为负数。
通过提供以下内容可以轻松解决此问题dtype=np.int64:
a = np.array([2, 0, 0, 4, 0, 1, 0, 4, 5, 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
TA贡献1825条经验 获得超6个赞
NumPy 数组使用固定大小的整数类型(例如) ,这与大小不受限制的int64
常规 Python 类型不同。int
它们具有可以代表的最大值。尝试添加大于此最大值的值会导致溢出,这可能会导致有符号整数类型出现负值。
例如,该类型的最大值int32
为 2 31 −1 = 2147483647,加 1 得到最小值 −2 31 = −2147483648。对于int64
类型来说,这些值要大得多;分别为9223372036854775807和-9223372036854775808。根据您的实现(即 NumPy 默认使用的类型)和您使用的输入,您可能会或可能不会看到此行为。
就您而言,与 Python 列表相比,您似乎没有使用 NumPy 数组提供的任何功能,因此您可以只使用a = [2, 0, 0, 4, 0, 1, 0, 4, 5, 5]
并依赖 Python 为您处理无限的大整数。
添加回答
举报