为什么这两个 numpy.divide 操作给出如此不同的结果?

Why do these two numpy.divide operations give such different results?

我想使用 here;

中描述的公式更正相机的高光谱读数中的值

the captured data is subtracted by dark reference and divided with white reference subtracted dark reference.

在原始示例中,任务相当简单,白色和黑色参考与主要数据具有相同的形状,因此公式执行为:

corrected_nparr = np.divide(np.subtract(data_nparr, dark_nparr),
np.subtract(white_nparr, dark_nparr))

但是根据我的经验,主要数据要大得多。我的形状如下;

$ white_nparr.shape, dark_nparr.shape, data_nparr.shape
((100, 640, 224), (100, 640, 224), (4300, 640, 224))

这就是我 repeat 引用数组的原因。

   white_nparr_rep = white_nparr.repeat(43, axis=0)
   dark_nparr_rep = dark_nparr.repeat(43, axis=0)
return np.divide(np.subtract(data_nparr, dark_nparr_rep), np.subtract(white_nparr_rep, dark_nparr_rep))

它的工作几乎完美,如左侧图像所示。但是这种方法需要 巨大的 数量的 内存 ,所以我决定遍历大数组并在移动中用更正的值替换原始值相反:

ref_scale = dark_nparr.shape[0]
data_scale = data_nparr.shape[0]

for i in range(int(data_scale / ref_scale)):
    data_nparr[i*ref_scale:(i+1)*ref_scale] = 
        np.divide
        ( 
        np.subtract(data_nparr[i*ref_scale:(i+1)*ref_scale], dark_nparr),
        np.subtract(white_nparr, dark_nparr)
        )

但是这种遍历方法给了我最丑陋的结果,如右图所示。如果有任何想法可以帮助我解决此问题,我将不胜感激。

注:我应用20次相加(20次读数的平均值)得到下图

编辑:dtype 每个数组如下:

$ white_nparr.dtype, dark_nparr.dtype, data_nparr.dtype
(dtype('float32'), dtype('float32'), dtype('float32'))

你的两种方法不一致,因为你用的是第一种方法

   white_nparr_rep = white_nparr.repeat(43, axis=0)

但是第二种方法对应使用

   white_nparr_rep = np.tile(white_nparr, (43, 1, 1))

如果第一种方法正确,您将不得不调整第二种方法以相应地执行操作。也许

for i in range(int(data_scale / ref_scale)):
    data_nparr[i*ref_scale:(i+1)*ref_scale] = 
        np.divide
        ( 
        np.subtract(data_nparr[i*ref_scale:(i+1)*ref_scale], dark_nparr[i]),
        np.subtract(white_nparr[i], dark_nparr[i])
        )

一个简单的二维数组示例,显示 repeattile 之间的区别:

In [146]: z
Out[146]: 
array([[ 1,  2,  3,  4,  5],
       [11, 12, 13, 14, 15]])

In [147]: np.repeat(z, 3, axis=0)
Out[147]: 
array([[ 1,  2,  3,  4,  5],
       [ 1,  2,  3,  4,  5],
       [ 1,  2,  3,  4,  5],
       [11, 12, 13, 14, 15],
       [11, 12, 13, 14, 15],
       [11, 12, 13, 14, 15]])

In [148]: np.tile(z, (3, 1))
Out[148]: 
array([[ 1,  2,  3,  4,  5],
       [11, 12, 13, 14, 15],
       [ 1,  2,  3,  4,  5],
       [11, 12, 13, 14, 15],
       [ 1,  2,  3,  4,  5],
       [11, 12, 13, 14, 15]])

题外话后记:我不知道为什么您链接到的页面的作者将 NumPy 表达式写为(例如):

corrected_nparr = np.divide(
    np.subtract(data_nparr, dark_nparr),
    np.subtract(white_nparr, dark_nparr))

NumPy 允许您将其写为

corrected_nparr = (data_nparr - dark_nparr) / (white_nparr - dark_nparr)

whick 看起来好多了。