scipy.ndimage.zoom()对于“ order = 0”的异常行为

问题描述 投票:0回答:2

[scipy.ndimage.zoom()时,我很难理解scipy.ndimage.zoom()的行为。

请考虑以下代码:

order=0

其输出为:

import numpy as np
import scipy as sp
import scipy.ndimage

arr = np.arange(3) + 1
print(arr)
for order in range(5):
    zoomed = sp.ndimage.zoom(arr.astype(float), 4, order=order)
    print(order, np.round(zoomed, 3))

因此,当0 [1. 1. 1. 2. 2. 2. 2. 2. 2. 3. 3. 3.] 1 [1. 1.182 1.364 1.545 1.727 1.909 2.091 2.273 2.455 2.636 2.818 3. ] 2 [1. 1.044 1.176 1.394 1.636 1.879 2.121 2.364 2.606 2.824 2.956 3. ] 3 [1. 1.047 1.174 1.365 1.601 1.864 2.136 2.399 2.635 2.826 2.953 3. ] 4 [1. 1.041 1.162 1.351 1.59 1.86 2.14 2.41 2.649 2.838 2.959 3. ] 时,值(预期)未插值。但是,我期望有:

order=0

即由于缩放是整数,因此每个值的元素数完全相同。因此,我期望得到与[1. 1. 1. 1. 2. 2. 2. 2. 3. 3. 3. 3.] 相同的结果:

np.repeat()

为什么每个元素重复的次数会有变化?


请注意,np.repeat()不能直接用于多维数组,这就是为什么我想从print(np.repeat(arr.astype(float), 4)) [1. 1. 1. 1. 2. 2. 2. 2. 3. 3. 3. 3.] 中获得“正确”的行为。


我的NumPy和SciPy版本是:

np.repeat()

我发现了:scipy.ndimage.zoom()这指出了print(np.__version__) # 1.17.4 print(sp.__version__) # 1.3.3 的某些意外行为,但我不太确定是否观察到相同的效果。

python numpy scipy zoom ndimage
2个回答
1
投票

我认为这是预期的行为。

请考虑您的初始列表,`scipy.ndimage.zoom` vs `skimage.transform.rescale` with `order=0`。您要求scipy放大4倍,从而创建4x3 = 12元素列表。列表的第一个元素必须为1,最后一个元素必须为3。然后,对于2,我们有偶数个元素,因此将2作为第6个和第7个元素都是有意义的。这得到scipy.ndimage.zoom()。从这里开始,您提供了order = 0的缩放,这意味着缩放将使用样条为0的样条曲线来填充缺失值。第一种情况,缩放需要填充1到2之间的4个缺失值。 [1, 2, 3]。第二种情况,2到3之间缺少4个值。相同的逻辑[1, , , , , 2, 2, , , , , 3]。最终结果[1, 1, 2, 2]

现在考虑5倍缩放,它会生成15个元素的数组。相同的故事,只是有一个“中间”元素,因此在新列表的第8个位置最初仅放置一个2。每对之间有六个元素可填充,我们得到相同的逻辑[2, 2, 3, 3]

因此,您得到的2s多于1s或3s,因为2涉及两个插值操作,而1和3都涉及一个。


0
投票

这是bin / edge数组解释问题。[1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3]的行为是基于对数组值的边缘解释,而针对整数缩放因子(模仿[1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3])会生成大小相等的块的行为是基于bin解释的。

让我们用一些“图片”来说明。

Bin解释

考虑数组scipy.ndimage.zoom(),让我们将每个值分配给bin。每个垃圾箱的边缘为:np.repeat()[1 2 3]0111,依此类推

2

现在,让我们将该数组缩放4倍:

2

因此,使用隔壁邻居方法分配给垃圾箱的值是:

0 1 2 3
|1|2|3|

边缘解释

考虑与 1 1 1 0 1 2 3 4 5 6 7 8 9 0 1 2 | 1 | 2 | 3 | 之前相同的数组,但是现在让我们将每个值分配给一个边:

                    1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2
|1 1 1 1|2 2 2 2|3 3 3 3|

现在,让我们将该数组缩放4倍:

[1 2 3]

因此,使用隔壁邻居方法分配给边缘的值是:

0 1 2
| | |
1 2 3

并且将边缘 1 1 0 1 2 3 4 5 6 7 8 9 0 1 | | | | | | | | | | | | 1 2 3 分配给 1 1 0 1 2 3 4 5 6 7 8 9 0 1 | | | | | | | | | | | | 1 1 1 2 2 2 2 2 2 3 3 3 ,因为3的位置为2,而2的位置为5.51。类似地,将边缘0分配给(5.5 - 3 = 2.5) < (3 - 0 = 3),因为8


在物理学中,“ bin数组解释”通常更有用,因为测量通常是“在适当域中的某个bin上进行某些积分的结果”(尤其是任何形式的信号-包括图像-在给定的时间间隔),因此我期待2的“ bin解释”,但我承认“ edge解释”同样有效(尽管我不确定哪个应用程序从中受益最大)。


((感谢@ Patol75将我指向右边的(8 - 5.5 = 2.5) < (11 - 8 = 3)

© www.soinside.com 2019 - 2024. All rights reserved.