如何在numpy中获得从高分辨率到低分辨率的映射

2024-05-16 05:59:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要做一个函数,它接受一个高分辨率的索引向量,例如hr,并在低分辨率lr采样时输出相应的索引。在

我的想法是创建一个翻译矩阵,如下所示:

在下面的矩阵中,其高分辨率为(6, 12),其低分辨率为(2, 4)

enter image description here

如果输入向量是

v = [0, 1, 4, 24, 36, 42]

我会把我的翻译成

w = m[v]我希望输出[0,0,1,0,4,6]

问题:

  1. 走这条路对吗?在
  2. 如果是这样,我如何在numpy中创建mndarray?在

另外,如果这个问题有更好的名字,请告诉我,以便我可以改变它。在


Tags: 函数numpyhr矩阵名字向量高分辨率低分辨率
1条回答
网友
1楼 · 发布于 2024-05-16 05:59:00

节省空间的方式:

import numpy as np

hires = np.array((6, 12))
lowres = np.array((2,4))
h, w = hires // lowres

m = np.arange(np.prod(lowres)).reshape(lowres)
print(m)
# [[0 1 2 3]
#  [4 5 6 7]]

v = [0, 1, 4, 24, 36, 42]
i, j = np.unravel_index(v, hires)
w = m[i // h, j // w]
print(w)
# [0 0 1 0 4 6]

空间效率低的方式:

^{pr2}$

这里的主要思想是使用^{}将一个“平面索引”转换成给定数组形状的坐标元组。在

例如

In [446]: np.unravel_index([0, 1, 4, 24, 36, 42], (6, 12))
Out[446]: (array([0, 0, 0, 2, 3, 3]), array([0, 1, 4, 0, 0, 6]))

它返回两个索引数组,它们一起给出shape(6,12)数组中第0、1、4等元素的坐标。在

空间效率低下的方法构造大的m数组,然后通过索引m和这些坐标:w = m[np.unravel_index(v, hires)]来找到{}。在

空间效率更高的方法只需将坐标除以块大小(在本例中为3×3)来生成低分辨率坐标。 这就避免了生成大矩阵m的需要。我们可以用更小的矩阵

In [447]: m = np.arange(np.prod(lowres)).reshape(lowres); m
Out[447]: 
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])

然后索引到:w = m[i // h, j // w]。在


您可能还对^{}感兴趣,它是np.unravel_index的逆:

In [451]: np.ravel_multi_index((np.array([0, 0, 0, 2, 3, 3]), np.array([0, 1, 4, 0, 0, 6])), (6, 12))
Out[451]: array([ 0,  1,  4, 24, 36, 42])

它将坐标数组ij转换回v。在

相关问题 更多 >