[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
的某些意外行为,但我不太确定是否观察到相同的效果。
我认为这是预期的行为。
请考虑您的初始列表,`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都涉及一个。
这是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解释的。
让我们用一些“图片”来说明。
考虑数组scipy.ndimage.zoom()
,让我们将每个值分配给bin。每个垃圾箱的边缘为:np.repeat()
的[1 2 3]
和0
,1
的1
和1
,依此类推
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.5
和1
。类似地,将边缘0
分配给(5.5 - 3 = 2.5) < (3 - 0 = 3)
,因为8
。
在物理学中,“ bin数组解释”通常更有用,因为测量通常是“在适当域中的某个bin上进行某些积分的结果”(尤其是任何形式的信号-包括图像-在给定的时间间隔),因此我期待2
的“ bin解释”,但我承认“ edge解释”同样有效(尽管我不确定哪个应用程序从中受益最大)。
((感谢@ Patol75将我指向右边的(8 - 5.5 = 2.5) < (11 - 8 = 3)
)