我在代码中遇到了非常奇怪的问题:
我有多个适合格式的图像文件,我从中存储数据列表和附加的曝光时间。之后,我为每个 exptime 创建一个数据列表,然后对数组进行 sum() ,然后对列表的 len() 进行 np.divide() 。它对于第一个值效果很好,但第二个值给出了极其奇怪的结果。
这是部分代码:
for time in exptimes:
data = [d[0] for d in datas if d[1] == time]
for item in data:
print(item.shape, item[-1][-1])
result = sum(data)
print(result.shape, result[-1][-1])
master = np.divide( result, float(len(data)) )
print(master.shape, master[-1][-1] )
在每一步中,我都会测试数组的形状和其中的最后一个元素。
以下是列表元素的输出:
(1504, 2056) 7039
(1504, 2056) 6993
(1504, 2056) 7047
(1504, 2056) 6951
(1504, 2056) 6927
(1504, 2056) 6999
(1504, 2056) 6905
(1504, 2056) 6962
(1504, 2056) 6954
(1504, 2056) 6932
(1504, 2056) 6865
(1504, 2056) 6903
(1504, 2056) 6852
(1504, 2056) 6817
(1504, 2056) 6905
(1504, 2056) 6819
(1504, 2056) 6766
(1504, 2056) 6837
(1504, 2056) 6737
(1504, 2056) 6770
(1504, 2056) 6741
(1504, 2056) 6738
(1504, 2056) 6759
(1504, 2056) 6675
(1504, 2056) 6710
(1504, 2056) 6615
(1504, 2056) 6705
(1504, 2056) 6653
(1504, 2056) 6648
(1504, 2056) 6579
有人会遇到,这些值的 sum() 将是 204803,但结果是:
(1504, 2056) 8195
我真的很迷茫,这里可能出了什么问题,为什么结果是这样的。
我尝试排除第一个值列表,因此代码仅适用于第二个值,但结果是相同的。
您遇到的问题可能是由于对数组求和时出现整数溢出。 FITS 文件通常以有限精度的格式存储数据,例如 16 位整数 (int16)。当您对多个此类数组求和时,总和可能会超过可以存储在 16 位整数中的最大值,从而导致溢出和不正确的结果。
让我们通过一个例子来理解这一点,例如 int 16, 现在,最大值为 32,767。如果总和超过该值,则会返回负数。因此,我们需要防止这种情况发生,为了防止这种情况发生,您应该确保求和以更高精度的格式(如 float 64)完成。 您可以在求和之前将数据数组转换为 float64。
我附上下面的Python程序来解决这个问题。
import numpy as np
for time in exptimes:
# Convert data arrays to float64 before summing to avoid overflow
data = [d[0].astype(np.float64) for d in datas if d[1] == time]
for item in data:
print(item.shape, item[-1][-1])
result = sum(data)
print(result.shape, result[-1][-1])
master = np.divide(result, float(len(data)))
print(master.shape, master[-1][-1])
我希望此代码能够解决您的疑问。