gpt4 book ai didi

python 错误?等效函数 - 一个变量溢出但另一个不溢出

转载 作者:太空宇宙 更新时间:2023-11-03 14:58:45 25 4
gpt4 key购买 nike

我有以下两个(假设是等价的)函数,看看哪个执行得更快(将用于处理大数据集)

import numpy as np


def interval_energy(array, start_intensity, intensity_window_length):
bins = np.bincount(array.ravel())
energy = 0
for i in range(start_intensity, min(start_intensity + intensity_window_length, len(bins))):
energy += bins[i] * (i ** 2)

print("Energy: {}".format(energy))
return energy


def interval_energy2(array, start_intensity, intensity_window_length):
flat_array = array.ravel()
energy = 0
for i in range(0, array.size):
if start_intensity <= flat_array[i] < (start_intensity + intensity_window_length):
energy += flat_array[i] ** 2

print("Energy2: {}".format(energy))
return energy

我正在使用以下代码来测试代码:

if __name__ == '__main__':
import timeit
setup = """
from interval_energy import interval_energy, interval_energy2
import numpy as np
a = np.random.randint(0, 3000, (150, 150, 150))
"""

t = timeit.Timer('interval_energy(a, 50, 2450)', setup)
t2 = timeit.Timer('interval_energy2(a, 50, 2450)', setup)
t3 = timeit.Timer("""
interval_energy(a, 50, 2450)
interval_energy2(a, 50, 2450)
""", setup)

print(t.timeit(5))
print(t2.timeit(5))
print(t3.timeit(5))

然而,在 interval_energy2 中,能量变量溢出并引发此错误:

RuntimeWarning: overflow encountered in long_scalars

更新 1:我注意到在第一个版本中,能量在创建时是 int 类型,在返回时是 int64 类型,而在函数的第二个版本中,它在创建时也是 int 类型,但保持 int32 直到它返回的点。因此溢出。为什么Python在一种情况下会自动转换变量而在另一种情况下不会自动转换变量

更新2:已确定这两个函数在理论上产生相同的结果。

更新 3:我正在使用 Python3.5.2 64 位。我读过 Python3 ONLY uses long,所以我在这里看到的(32 位整数溢出)应该是不可能的? 可能是因为 pandas/numpy 的 c-stack

更新 4:Windows 的 CPython 可能存在错误,因为相同的代码在 OSX/unix 上运行良好(相同的 python,两个系统上使用的 numpy 版本)

最佳答案

找到了。这是个好问题:

print type(flat_array[3])
<type 'numpy.int32'>

但是,在 bincount 之后:

print type(bins[3])
<type 'numpy.int64'>

显然分箱转换了数据类型,而您没有注意到!这就是 f5r5e5d 的修复起作用的原因。所以你应该在两者上都出错,但第一个被幸免。更改数组定义:

a = np.random.randint(0, 3000, (150, 150, 150),dtype=np.int64)

如 f5r5e5d 所建议。我没有收到任何错误并关闭,但结果不完全相同 - 这取决于您。

编辑目前似乎在 2.7.9 之后的版本中,其中 dtype 是数组的允许关键字,默认的 dtype 是根据给数组的值。使用 energy=np.int64() 将确保我们期望溢出的变量是一个大 int。

关于 python 错误?等效函数 - 一个变量溢出但另一个不溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40268201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com