scipy 如何使用www.example.com _坐标设置插值问题ndimage.map?

xxslljrj  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(152)

根据文档scipy.ndimage.map_coordinates
坐标数组用于为输出中的每个点查找输入中的相应坐标。这些坐标处的输入值由所需阶数的样条插值确定。
输出的形状是通过放置第一个轴从坐标数组的形状派生出来的。沿着第一个轴的数组值是输入数组中找到输出值的坐标。
我有一个在三维网格上定义的离散三维函数 (t,x,y);在该3D网格的每个点上,该函数具有唯一的值,除非其值为零。
我有另一组Pandas Dataframe 形式的数组,有三列,t_newx_newy_new
我想使用scipy.ndimage.map_coordinates对函数进行插值,以便在所述 Dataframe 中呈现的新数据集上计算其值。
由于我收到以下错误消息,因此我确定我没有正确设置map_coordinates:

File "D:\Users\username\Anaconda3\lib\site-packages\scipy\ndimage\interpolation.py", line 437, in map_coordinates

raise RuntimeError('invalid shape for coordinate array')

下面是我对插值函数的定义:

from scipy.ndimage import map_coordinates

def interpolator_3d(df, func_values):

    # The coordinates at which input is evaluated

    coordinates = df[['t_new', 'x_new', 'y_new']].values.T    # (3, 1273)

    # list of input array [[t0, x0, y0, value0], [t1, x1, y1, value1], ...]

    input_arr = func_values                                 # (1780020000, 4)

    return map_coordinates(input_arr, coordinates)
guicsvcw

guicsvcw1#

使用map_coordinates至少有两个问题。请记住,此函数是为图像重采样而设计的。
1.如果你有一个三维函数,数组input_arr应该是三维的。map_coordinates将使用索引作为txy坐标。函数的值v必须存储在每个相应的位置。如果你的原始函数有另一个基本网格,那么你必须根据前后的数组索引来规范化所有的东西。2这需要一个等距的网格作为输入。

  1. coordinates必须是例如[[t_new_0, t_new_1, ...], [x_new_0, x_new_1 ...], [y_new_0, y_new_1, ...]]形式的阵列。结果将是内插样本[[v_new_0, v_new_1, ...]]的列表。通常,如果input_arrayn维的,coordinates必须是包含n数组的列表,这些数组具有相同的形状S。结果将是形状为S的数组的列表。
    n =3个维度和5个采样以在1维形状中插值的示例:
import numpy as np
from scipy import ndimage

a = np.arange(64.).reshape((4, 4, 4))
print(a)

out = ndimage.map_coordinates(a, [
  [0.5, 1.0, 1.5, 2.0, 2.5], [0.1, 0.2, 0.3, 0.4, 0.5], [2.0, 1.9, 1.8, 1.7, 1.6]
])
print(out)

输出量:

[[[ 0.  1.  2.  3.]
  [ 4.  5.  6.  7.]
  [ 8.  9. 10. 11.]
  [12. 13. 14. 15.]]
 [[16. 17. 18. 19.]
  [20. 21. 22. 23.]
  [24. 25. 26. 27.]
  [28. 29. 30. 31.]]
 [[32. 33. 34. 35.]
  [36. 37. 38. 39.]
  [40. 41. 42. 43.]
  [44. 45. 46. 47.]]
 [[48. 49. 50. 51.]
  [52. 53. 54. 55.]
  [56. 57. 58. 59.]
  [60. 61. 62. 63.]]]

[ 7.6688, 18.148 , 26.3424, 34.6304, 45.3904]

更新日期:

这意味着,如果input_array的形式为[[t0, x0, y0, value0], [t1, x1, y1, value1], ...],长度为1780020000 = 19778 * 500 * 180,则必须相应地将其转换为(19778, 500, 180)形式的数组:

t_max, x_max, y_max, _ = np.max(func_values, axis=0).astype(int) + 1  # 19778, 500, 180
input_arr = np.zeros((t_max, x_max, y_max), dtype=float)

for t, x, y, v in func_values:
  input_arr[int(t), int(x), int(y)] = v

相关问题