我需要你的好建议。我有一个hdf5文件,我可以用python读取文件。 h5文件包含大量数据,这些都是电位值(取决于位置(x,y,z))。我还可以通过使用RegularGridInterpolator插入3D常规网格数据。现在,我的问题是:如何将我的h5文件数据定义为x,y,z的函数,以便它能够更新a_1(x,y,z)和a_2(x,y,z)。我的代码中的。值。这是我的h5文件的链接:https://drive.google.com/open?id=1OFIg7pjfpfjq3Vnvqaj2uyCFjiTwZ9QK
我的代码:
TypeError
答案 0 :(得分:0)
我会尽力帮助。您的问题与scipy RegularGridInterpolator()
有关,而不是HDF5。 HDF5只是一个数据源。我建议您在使用HDF5之前先通过scipy示例进行工作。它显示了插值功能如何定义和使用网格坐标和值。
我查看了您的HDF5文件(k.h5
)。它只有一个在网格点处具有潜在值的数据集。它在网格点(x,y,z值)没有坐标。您在代码中用以下几行定义了x,y,z坐标:
x = np.linspace(-160, 160, 64)
y = np.linspace(-160, 160, 64)
z = np.linspace(-160, 160, 64)
通常将坐标和值存储在一起。在执行此操作时,您可以将任何x,y,z坐标与这些网格值关联。那是你的意图吗?
我重新编写了代码的第一部分,以内插一些值。见下文。我对np.gradient()
不熟悉,所以在那部分上无济于事。
对RegularGridInterpolator()
(和返回值)的第一次调用是使用您在上面提供的x,y,z值完成的。
对RegularGridInterpolator()
(和返回值)的第二次调用是针对数据集的角坐标(第一个/最后一个值)完成的。它确认内插器返回“正确答案”。
更新代码以插值:
import numpy as np
from numpy import gradient
import h5py
#import matplotlib.pyplot as plt
from scipy.interpolate import RegularGridInterpolator
f = h5py.File('k.h5', 'r')
list(f.keys())
dset = f[u'data'][:,:,:]
print ('dset.shape=', dset.shape)
print ('dset.first/last=', dset[0,0,0], dset[-1,-1,-1])
x = np.linspace(-160, 160, 64)
y = np.linspace(-160, 160, 64)
z = np.linspace(-160, 160, 64)
my_interpolating_function = RegularGridInterpolator((x, y, z), dset)
pts = np.array([100, 5, -10])
print ('pts=', pts)
vals_at_pts = my_interpolating_function(pts)
print ('vals_at_pts=', vals_at_pts)
pts = np.array([[-160, -160, -160], [160, 160, 160]])
print ('pts=', pts)
vals_at_pts = my_interpolating_function(pts)
print ('vals_at_pts=', vals_at_pts)
输出:
dset.shape= (64, 64, 64)
dset.first/last= -2.386316671021661e-05 -2.966368162003158e-05
pts= [100 5 -10]
vals_at_pts= [-3.0528203e-07]
pts= [[-160 -160 -160] [ 160 160 160]]
vals_at_pts= [-2.38631667e-05 -2.96636816e-05]