假设我有一幅分辨率为HxWx3的图像,而我有一份被降采样到分辨率H‘x’x3 (resized_img)的图像。现在,假设我想在图像中找到最大值索引,这样做的一种方法是
ind=np.unravel_index(np.argmax(img,axis=None),img.shape)
但是,如果分辨率更大,则这种方法是缓慢的。另一方面,我可以在调整大小的img上找到最大索引。
img_resized=np.unravel(np.argmax(resized_img,axis=None),resized_img.shape)
现在,如果我想要在原始图像中对应的索引,我只是乘以一个比例因子,或者我如何做到这一点?
如果H=W和H‘’=W‘那么我可以相信我所要做的就是让
scale_factor=H/H'=W/W'
和
ind=resized_ind * scale_factor
但我不确定这是否正确,以及如何处理$H \neq $时的情况。
发布于 2020-10-20 20:46:13
ravel/unravel不改变数组;它们只是根据形状计算新的索引。
考虑一个简单的3d数组:
In [63]: arr = np.arange(24).reshape(2,3,4)
In [64]: arr
Out[64]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
该数组中包含一个索引元组的点:
In [65]: arr[0,1,2]
Out[65]: 6
狂暴与毁灭:
In [66]: np.ravel_multi_index([0,1,2],arr.shape)
Out[66]: 6
In [67]: np.unravel_index(6, arr.shape)
Out[67]: (0, 1, 2)
有一个ravel
方法,但它只是一个reshape
,因此是一个view
(至少在order
等方面没有变化):
In [69]: arr.ravel()
Out[69]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
ravel_multi_index
的计算只是:
In [70]: 2 + 4*1 + 12*0
Out[70]: 6
而unravel
则是相反的。我不会进入细节,但它可能使用某种模数。
另一种方法是比较两种不同形状的运行时间:
In [71]: np.unravel_index(1000, (1080,1620,3))
Out[71]: (0, 333, 1)
In [72]: np.unravel_index(1000, (256,256,3))
Out[72]: (1, 77, 1)
In [73]: timeit np.unravel_index(1000, (1080,1620,3))
5.14 µs ± 128 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [74]: timeit np.unravel_index(1000, (256,256,3))
4.84 µs ± 29.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
这两个形状的运行时间大致相同(它们在±因子内重叠)。
https://stackoverflow.com/questions/64451694
复制相似问题