繁体   English   中英

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

[英]How to get a mapping from high to low resolution ndarray in numpy

我需要制作一个函数,该函数接收高分辨率的索引向量,例如hr ,并在以低分辨率lr采样时输出其相应的索引。

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

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

在此处输入图片说明

如果输入向量是

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

我会实现我的翻译

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

问题:

  1. 这是正确的方法吗?
  2. 如果是这样,我如何在 numpy 中创建那个m ndarray?

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

节省空间的方式:

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]

空间效率低的方式:

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

# DON'T DO THIS. INEFFICIENT
m = np.kron(np.arange(np.prod(lowres)).reshape(lowres), np.ones(h, w), )
print(m)
# [[0. 0. 0. 1. 1. 1. 2. 2. 2. 3. 3. 3.]
#  [0. 0. 0. 1. 1. 1. 2. 2. 2. 3. 3. 3.]
#  [0. 0. 0. 1. 1. 1. 2. 2. 2. 3. 3. 3.]
#  [4. 4. 4. 5. 5. 5. 6. 6. 6. 7. 7. 7.]
#  [4. 4. 4. 5. 5. 5. 6. 6. 6. 7. 7. 7.]
#  [4. 4. 4. 5. 5. 5. 6. 6. 6. 7. 7. 7.]]

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

这里的主要思想是使用np.unravel_index将“平面索引”转换为给定要索引的数组形状的坐标元组。

例如,

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]))

它返回两个索引数组,它们一起给出形状为 (6, 12) 的数组中第 0、1、4 等“扁平”元素的坐标。

空间效率低下的方法构造大m数组,然后通过使用这些坐标索引m找到ww = 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.ravel_multi_index感兴趣,它是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM