将数组值更改为特定值/间隔?

时间:2017-12-12 14:58:37

标签: python numpy scipy rotation

我使用scipy.ndimage.rotate旋转形状dtypenp.float323x3,...的不同数组(5x531x31)。输入数组总是有sum <= 1.0,在大多数情况下,总和等于1.0减去非常小的epsilon。这些数组的最小值始终为>= 0.0

我的期望是我应该总是得到[0.0, 1.0]作为scipy.ndimage.rotate的结果在-1.0755285551056204e-16区间内的数组,但有时我会得到非常小的负值,例如{{1} }。我想这似乎是由于浮点数不准确?!

但是,我想将输出数组的值压缩到预期的时间间隔[0.0, 1.0](同时还要确保总和&lt; = 1.0)。我怎样才能尽快实现这个目标(计算时间)?

softmax这样的东西不是个好主意,因为它以某种方式(指数)重新调整数组的值,使得已经很高的值变得更高。

在极少数情况下,返回的scipy.ndimage.rotate数组也有一个&gt; 1.0(正浮点不精确?!),因此我认为简单地使用sigmoid function不是一个好主意,因为我只是单独缩放值,而不是检查总和是&lt; = 1.0。

1 个答案:

答案 0 :(得分:1)

旋转涉及样条插值。在0和1之间的值的插值有时会产生区间[0,1]之外的值。只要这些偏差很小(而且它们应该很小),就没有必要仔细思考它们; numpy.clip会做得很快。

image = np.clip(image, 0, 1)

对于总和 - 旋转后阵列的总和预计不相同。如果使用reshape=False,则图像的一部分会消失。如果不是,新图像仍然不会具有与旧图像完全相同的值,因为它们被重新插值到不同的网格。总和可以上升或下降。

由于sum <= 1的要求在几何上不是自然的,因此没有几何上自然的方法来确保它。所以你可以做任何你想要的代数操作。像这样:

if image.sum() > 1:
    image /= image.sum()