如何将hdf5文件定义为某些因变量的函数?

问题描述 投票:0回答:1

我需要你的善意建议。我有一个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
python scipy interpolation hdf5 h5py
1个回答
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]
© www.soinside.com 2019 - 2024. All rights reserved.