我在理解函数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
型
2条答案
按热度按时间wpx232ag1#
代码不工作的原因是因为
test_coords
的长度都是3,而test_density
的长度只有3。如果打印出scipy示例中的values.shape
,您将看到形状为(5, 6, 7)
,它与每个坐标的长度匹配(x
的长度为5,y
的长度为6,z
的长度为7)。因此,根据您显示的坐标,您的test_density
的形状应该是(3,3,3)
。e1xvtsh32#
scipy.interpolate.interpn
在直线网格上执行数据插值。为此,函数调用要求用户提供网格点的坐标、这些网格点处给定字段的值以及应返回插值的点的坐标。在文档中的示例中,网格点的坐标以三个一维NumPy数组的元组形式给出。每个NumPy数组包含网格顶点沿着空间中单个轴的坐标。这足以推导出所有网格点的坐标,给定网格的假定结构。要插值的字段的值作为3-D NumPy数组提供。该阵列的形状必须是以坐标给出的每个1-D NumPy阵列的大小的相同顺序的组合。最后,请求插值的点的坐标应该是一个2-D NumPy数组:第一维对应于应当执行内插的点的数量,而第二维表示空间轴的数量。
在尝试使用
interpn
时存在多个问题。在我看来,您提供的是单个点的完整坐标,而不是每个轴上网格的坐标。这些坐标必须严格递增或递减。假设后者是正确的,您将在这三个点上提供值,这是一致的,但请记住,您必须将所有网格点的值作为3D NumPy数组提供(考虑到您的空间似乎是3D的)。