使用scipy.interpolation.interpn有问题

mfpqipee  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(122)

我在理解函数interpn中参数的输入格式时遇到了问题。文档中给出的示例真的让我很困惑
以下是他们给出的例子:

import numpy as np  
from scipy.interpolate import interpn  
def value_func_3d(x, y, z):
        return 2 * x + 3 * y - z
x = np.linspace(0, 4, 5)
y = np.linspace(0, 5, 6)
z = np.linspace(0, 6, 7)
points = (x, y, z)
values = value_func_3d(*np.meshgrid(*points, indexing='ij'))
point = np.array([2.21, 3.12, 1.15])
print(interpn(points, values, point))

字符串
下面是点和值的样子

print(points)

(array([0., 1., 2., 3., 4.]), array([0., 1., 2., 3., 4., 5.]), array([0., 1., 2., 3., 4., 5., 6.]))

print(values)

[[[ 0. -1. -2. -3. -4. -5. -6.]
  [ 3.  2.  1.  0. -1. -2. -3.]
  [ 6.  5.  4.  3.  2.  1.  0.]
  [ 9.  8.  7.  6.  5.  4.  3.]
  [12. 11. 10.  9.  8.  7.  6.]
  [15. 14. 13. 12. 11. 10.  9.]]

 [[ 2.  1.  0. -1. -2. -3. -4.]
  [ 5.  4.  3.  2.  1.  0. -1.]
  [ 8.  7.  6.  5.  4.  3.  2.]
  [11. 10.  9.  8.  7.  6.  5.]
  [14. 13. 12. 11. 10.  9.  8.]
  [17. 16. 15. 14. 13. 12. 11.]]

 [[ 4.  3.  2.  1.  0. -1. -2.]
  [ 7.  6.  5.  4.  3.  2.  1.]
  [10.  9.  8.  7.  6.  5.  4.]
  [13. 12. 11. 10.  9.  8.  7.]
  [16. 15. 14. 13. 12. 11. 10.]
  [19. 18. 17. 16. 15. 14. 13.]]

 [[ 6.  5.  4.  3.  2.  1.  0.]
  [ 9.  8.  7.  6.  5.  4.  3.]
  [12. 11. 10.  9.  8.  7.  6.]
  [15. 14. 13. 12. 11. 10.  9.]
  [18. 17. 16. 15. 14. 13. 12.]
  [21. 20. 19. 18. 17. 16. 15.]]

 [[ 8.  7.  6.  5.  4.  3.  2.]
  [11. 10.  9.  8.  7.  6.  5.]
  [14. 13. 12. 11. 10.  9.  8.]
  [17. 16. 15. 14. 13. 12. 11.]
  [20. 19. 18. 17. 16. 15. 14.]
  [23. 22. 21. 20. 19. 18. 17.]]]


我尝试了以下方法,但不起作用。

test_coords = coords.iloc[0:3,:].to_numpy()
test_density = density.iloc[0:3].to_numpy()
interpn(test_coords, test_density, (1,1,1))


下面是test_coords和test_density的样子:

print(test_coords)
[[  0.4   0.4 -15.6]
 [  1.2   0.4 -15.6]
 [  2.    0.4 -15.6]]
print(test_density)
[7.17427017e-08 6.80979370e-08 6.13095000e-08]


下面是我在尝试运行interpn(test_coords, test_density, (1,1,1))时得到的错误消息

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-30-79d0b96dca9c> in <cell line: 16>()
     14 print(test_coords)
     15 print(test_density)
---> 16 interpn(test_coords, test_density, (1,1,1))
     17 
     18 

/usr/local/lib/python3.10/dist-packages/scipy/interpolate/_rgi.py in interpn(points, values, xi, method, bounds_error, fill_value)
    629     # sanity check consistency of input dimensions
    630     if len(points) > ndim:
--> 631         raise ValueError("There are %d point arrays, but values has %d "
    632                          "dimensions" % (len(points), ndim))
    633     if len(points) != ndim and method == 'splinef2d':

ValueError: There are 3 point arrays, but values has 1 dimensions

wpx232ag

wpx232ag1#

代码不工作的原因是因为test_coords的长度都是3,而test_density的长度只有3。如果打印出scipy示例中的values.shape,您将看到形状为(5, 6, 7),它与每个坐标的长度匹配(x的长度为5,y的长度为6,z的长度为7)。因此,根据您显示的坐标,您的test_density的形状应该是(3,3,3)

e1xvtsh3

e1xvtsh32#

scipy.interpolate.interpn在直线网格上执行数据插值。为此,函数调用要求用户提供网格点的坐标、这些网格点处给定字段的值以及应返回插值的点的坐标。
在文档中的示例中,网格点的坐标以三个一维NumPy数组的元组形式给出。每个NumPy数组包含网格顶点沿着空间中单个轴的坐标。这足以推导出所有网格点的坐标,给定网格的假定结构。要插值的字段的值作为3-D NumPy数组提供。该阵列的形状必须是以坐标给出的每个1-D NumPy阵列的大小的相同顺序的组合。最后,请求插值的点的坐标应该是一个2-D NumPy数组:第一维对应于应当执行内插的点的数量,而第二维表示空间轴的数量。
在尝试使用interpn时存在多个问题。在我看来,您提供的是单个点的完整坐标,而不是每个轴上网格的坐标。这些坐标必须严格递增或递减。假设后者是正确的,您将在这三个点上提供值,这是一致的,但请记住,您必须将所有网格点的值作为3D NumPy数组提供(考虑到您的空间似乎是3D的)。

相关问题