我需要你的建议。我有一个hdf5文件,我可以读取python文件。h5文件包含大量数据,这些是电位值(取决于位置(x,y,z))。我也可以用RegularGridInterpolator来插值我的三维规则网格数据。现在,我的问题是:如何将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、y、z坐标与这些网格值相关联。这是你的意图吗?你知道吗
我重新编写了代码的第一部分来插入一些值。见下文。我对
np.gradient()
不太熟悉,所以这部分我无能为力。对
RegularGridInterpolator()
(和返回值)的第一个调用是使用上面提供的x,y,z值完成的。 对RegularGridInterpolator()
(和返回值)的第二个调用是针对数据集的角坐标(第一个/最后一个值)完成的。它确认插值器返回“正确答案”。你知道吗更新了插值代码:
输出:
相关问题 更多 >
编程相关推荐