Как определить файл hdf5 как функцию некоторых зависимых переменных? - PullRequest
0 голосов
/ 09 марта 2019

Мне нужно ваше любезное предложение.У меня есть файл 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

1 Ответ

0 голосов
/ 11 марта 2019

Я постараюсь помочь.Ваш вопрос больше касается scipy RegularGridInterpolator(), чем HDF5.HDF5 - это просто источник данных.Я предлагаю вам проработать пример scipy перед использованием HDF5.Он показывает, как координаты и значения сетки определяются и используются функцией интерполяции.

Я посмотрел ваш файл 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]
...