为什么这两个 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])
)
一个简单的二维数组示例,显示 repeat
和 tile
之间的区别:
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 看起来好多了。
我想使用 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])
)
一个简单的二维数组示例,显示 repeat
和 tile
之间的区别:
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 看起来好多了。