python - 如何将 hdf5 文件定义为一些因变量的函数?
问题描述
我需要你的好意建议。我有一个 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
我的代码:
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']
dset.shap
dset.value.shape
dset[0:64, 0:64, 0:64]
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.value)
pts = np.array([100, 5, -10])
my_interpolating_function(pts)
# Apply gradient function
gradx, grady, gradz = np.gradient(dset.value)
gradx.shape
# To find the gradient at any point
gradx_interpol = RegularGridInterpolator((x, y, z), gradx)
grady_interpol = RegularGridInterpolator((x, y, z), grady)
gradz_interpol = RegularGridInterpolator((x, y, z), gradz)
def get_val_and_grads(pts):
v1, x1, y1, z1 = my_interpolating_function(pts), gradx_interpol(
pts), grady_interpol(pts), gradz_interpol(pts)
return v1, x1, y1, z1
##getting_interpolated_values
k1 = my_interpolating_function(pts)
k_dx = gradx_interpol(pts)
k_dy = grady_interpol(pts)
k_dz = gradz_interpol(pts)
def a_1(x,y,z):
return -(adot/a**2)*k1
def a_2(x,y,z):
return (1/a)*k_dx
解决方案
我会尽力提供帮助。您的问题与 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]
推荐阅读
- php - codeigniter 是否有“电子邮件”关键字?
- react-native - TypeError.undefined 不是对象(评估 _reactNativeCamera.RNCamera.constants.also
- datastax - 在datastax cassandra 5.1中,为什么dsetool缺少insights_config命令?
- graphviz - 如何在本地为子图设置节点?
- kotlin - 如何使用 Kotlin 和 Arrow 执行程序
- python - 在 python 中使用 sqlalchemy.select() 从 Postgresq 数据库中获取数据
- bash - 设置多个变量以在条件语句中调用
- swift - 如何在 swift 中使用 alamofire 发布字典数组?
- ruby-on-rails - rswag rails gem,无法识别我创建 swagger.yml 的模式
- javascript - 以角度将文件附加到FormData后无法上传文件