【问题标题】:python - Extend 2-d array and interpolate the missing valuespython - 扩展二维数组并插入缺失值
【发布时间】:2014-10-06 08:07:10
【问题描述】:

我有一个大小为 48x80 的数组,现在我想将数组扩展到一个大小为 117x192 的新数组。
我读过scipy.interpolate,但没有提到扩展。

如何扩展数组并将值放入新数组?

例如: 给定数组 A [[1,2,3],[4,5,6],[7,8,9]]

[1 2 3]
[4 5 6]
[7 8 9]

现在我想将数组 A 扩展到数组 B 大小为 5x7

1 x 2 x 3
x x x x x
x x x x x
4 x 5 x 6
x x x x x
x x x x x
7 x 8 x 9

其中,将这些“x”替换为插值。

示例 2: 在更一般的数组中

[4 2 6 4]
[4 34 6 2]
[2 11 3 4]
[2 4 22 4]
[2 1 35 255]
[1 3 4 54]
[22 1 4 5]

如果我想要一个大小为 20x30 的新数组该怎么办

更新: 我发现在我的情况下,@nicoguaro 的回答不起作用:

他的解决方案:

pts = np.array([[i,j] for i in np.linspace(0,1,n) for j in np.linspace(0,1,m)] )
grid_x, grid_y = np.mgrid[0:1:m*2j, 0:1:n*2j]

我的解决方案:

pts = np.array([[i,j] for i in np.linspace(0,2*m-1,m) for j in np.linspace(0,2*n-1,n)] )
grid_x, grid_y = np.mgrid[0:m*2, 0:n*2]

导致结果不同。事实上,他的解决方案在大多数情况下都有效,但我猜是 TIFF 文件

【问题讨论】:

  • 这一篇是关于将一​​行或多行追加到二维数组
  • 我认为您需要更具体地说明您的要求。
  • 我已经编辑了问题
  • 看看scipy.ndimage.zoom。对于您的示例,您需要result = ndimage.zoom(data, (7.0/3, 5.0/3))。 (请注意,scipy.ndimage 函数保留类型,因此如果您想要浮点输出,则需要将输入显式转换为浮点数。)

标签: python interpolation


【解决方案1】:

虽然 interpolate 没有针对此特定任务的功能,但您可以轻松地使用内置选项来执行此操作。使用您提出的相同示例

[1 2 3]
[4 5 6]
[7 8 9]

1 x 2 x 3
x x x x x
x x x x x
4 x 5 x 6
x x x x x
x x x x x
7 x 8 x 9

我们可以使用这段代码

import numpy as np
import scipy.interpolate as inter
import matplotlib.pyplot as plt

A = np.array([[1,2,3],[4,5,6],[7,8,9]])
vals = np.reshape(A, (9))
pts = np.array([[i,j] for i in [0.0, 0.5, 1.0] for j in [0.0, 0.5, 1.0]] )
grid_x, grid_y = np.mgrid[0:1:7j, 0:1:5j]
grid_z = inter.griddata(pts, vals, (grid_x, grid_y), method='linear')

结果是这样的

array([[ 1. ,  1.5,  2. ,  2.5,  3. ],
       [ 2. ,  2.5,  3. ,  3.5,  4. ],
       [ 3. ,  3.5,  4. ,  4.5,  5. ],
       [ 4. ,  4.5,  5. ,  5.5,  6. ],
       [ 5. ,  5.5,  6. ,  6.5,  7. ],
       [ 6. ,  6.5,  7. ,  7.5,  8. ],
       [ 7. ,  7.5,  8. ,  8.5,  9. ]])

或者,作为图像

在这种情况下,我使用了griddata,它将在一组点 (pts) 上定义的集合函数 (vals) 插入到给定的直线网格(由 grid_xgrid_y 给出)。例如,如果您想将nx 点用于$x$ 和ny 用于$y$,则可以替换一行

grid_x, grid_y = np.mgrid[0:1:nx*1j, 0:1:ny*1j]

对于nx=20ny=15,我们得到了这张图片

您可以在documentation of the function 上查看更多示例。

更新:包括示例2,其中矩阵为

A = np.array([[4, 2, 6, 4],
            [4, 34, 6, 2],
            [2, 11, 3, 4],
            [2, 4, 22, 4],
            [2, 1, 35, 255],
            [1, 3, 4, 54],
            [22, 1, 4, 5]])

对于大小为 20x30 的新数组。代码如下

import numpy as np
import scipy.interpolate as inter
import matplotlib.pyplot as plt

A = np.array([[4, 2, 6, 4],
            [4, 34, 6, 2],
            [2, 11, 3, 4],
            [2, 4, 22, 4],
            [2, 1, 35, 255],
            [1, 3, 4, 54],
            [22, 1, 4, 5]])
vals = np.reshape(A, (28))
pts = np.array([[i,j] for i in np.linspace(0,1,4) for j in np.linspace(0,1,7)] )
grid_x, grid_y = np.mgrid[0:1:20j, 0:1:30j]
grid_z = inter.griddata(pts, vals, (grid_x, grid_y), method='linear')

plt.matshow(A)
plt.matshow(grid_z)
plt.show()

生成的图像是:

【讨论】:

  • 感谢您的回复!这里有些不明白的地方:pts、grid_x、grid_y的目的。如果我想要一个大小为 m(rows)x n (columns) 的新数组,会发生什么变化
  • pts 是您知道值的点,在图像的情况下,这些点由直线网格给出。 grid_xgrid_y 是您要插入值的点,即 new 位置。您可以查看documentation 以获得解释。
  • 我刚刚扩展了答案。
  • 对不起,我还是不明白。我只是用更一般的新示例来更新问题
  • 它运行正常,但结果看起来很奇怪。我认为这是由于我的实际数据不同。这是我在第 [21] 行 [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0 中的原始数据. 0. 0. 0. 0. 0. 5.28000021 0. 0. 0. 0. 0. 0. 0. 0.06 0.15000001 0.02999997 0.50999999 0. 0. 2.70000005 7.40999985 0. 0. 0. 0. ]
猜你喜欢
  • 2023-01-25
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2016-10-06
  • 2016-03-13
  • 2011-06-06
相关资源
最近更新 更多