如何撤消或反转 np.meshgrid?

Zha*_*hen 9 python numpy image-processing

在图像调整大小插值问题中,可以在np.meshgrid对网格索引进行操作之前使用行和列索引:

nrows = 600
ncols = 800
image_in = np.random.randint(0, 256, size=(nrows, ncols, 3))
scale_factor = 1.5

r = np.arange(nrows, dtype=float) * scale_factor
c = np.arange(ncols, dtype=float) * scale_factor

rr, cc = np.meshgrid(r, c, indexing='ij')

# Nearest Neighbor Interpolation
# np.floor if scale_factor >= 1. np.ceil otherwise
rr = np.floor(rr).astype(int).clip(0, nrows-1)
cc = np.floor(cc).astype(int).clip(0, ncols-1)

image_out = image_in[rr, cc, :]
Run Code Online (Sandbox Code Playgroud)

现在,我该如何扭转这个过程呢?假设给定rr_1cc_1( 的乘积np.meshgrid)以未知方式处理(此处用 表示np.random.randint),我如何获得r_1c_1,即np.meshgrid(最好使用ij索引)的输入?

# Suppose rr_1, cc_1 = np.meshgrid(r_1, c_1, indexing='ij')
rr_1 = np.random.randint(0, nrows, size=(nrows, ncols, 3))
cc_1 = np.random.randint(0, ncols, size=(nrows, ncols, 3))

r_1 = ?
c_1 = ?
Run Code Online (Sandbox Code Playgroud)

更新:

发帖后我立刻就明白了。答案是:

# Suppose rr_1, cc_1 = np.meshgrid(r_1, c_1, indexing='ij')
rr_1 = np.random.randint(0, nrows, size=(nrows, ncols, 3))
cc_1 = np.random.randint(0, ncols, size=(nrows, ncols, 3))

r_1 = rr_1[:, 0]
c_1 = cc_1[0]
Run Code Online (Sandbox Code Playgroud)

b-f*_*-fg 8

从输入数组创建numpy.meshgrid一个更高维的数组,以创建类似网格的数组。因此,假设您想通过使用一些输入的一维向量r和来获得一个二维网格cnumpy.meshgrid返回rrcc作为 2D 数组,分别在 2D 数组上的任何位置保持 y 轴或 x 轴常数(这就是它是网格的原因)。

这是一个测试用例:

import numpy as np

r = np.arange(5)      # [0 1 2 3 4]
c = np.arange(5,10,1) # [5 6 7 8 9]

rr, cc = np.meshgrid(r,c,indexing='ij')

r_original = rr[:,0]
c_original = cc[0,:]

print(r_original)     # [0 1 2 3 4]
print(c_original)     # [5 6 7 8 9]
Run Code Online (Sandbox Code Playgroud)

rr请注意,我们为和创建的网格cc

rr = [[0 0 0 0 0]
      [1 1 1 1 1]
      [2 2 2 2 2]
      [3 3 3 3 3]
      [4 4 4 4 4]]

cc = [[5 6 7 8 9]
      [5 6 7 8 9]
      [5 6 7 8 9]
      [5 6 7 8 9]
      [5 6 7 8 9]]
Run Code Online (Sandbox Code Playgroud)

由于您在您的情况下使用indexing='ij'并且二维数组已转置。rr因此,和分别保持恒定的值cc是 x 轴和 y 轴(与不使用 的情况相反indexing='ij')。