Это достаточно интересный (и хитрый) вопрос, поэтому я решил, что заслуживает ответа, чтобы продемонстрировать пример скучной интерполяции с использованием данных из файла HDF5.Ниже есть 2 раздела кода.
Первый заполняет файл HDF5 определением сетки и mesh_data, используемыми при интерполяции.
Второй открывает файл HDF5 с шага 1и читает наборы данных x,y,z,
mesh_data
как массивы Numpy, используемые в примере.
Запустите этот код, чтобы создать файл HDF5:
import numpy as np
import h5py
def f(x,y,z):
return 2 * x**3 + 3 * y**2 - z
x = np.linspace(1, 4, 11)
y = np.linspace(4, 7, 22)
z = np.linspace(7, 9, 33)
mesh_data = f(*np.meshgrid(x, y, z, indexing='ij', sparse=True))
h5file = h5py.File('interpolate_test.h5', 'w')
h5file.create_dataset('/x', data=x)
h5file.create_dataset('/y', data=y)
h5file.create_dataset('/z', data=z)
h5file.create_dataset('/mesh_data', data=mesh_data)
h5file.close()
Затем запустите этот код, чтобы прочитать файл HDF5 с помощью h5py и выполнить интерполяцию:
import numpy as np
from scipy.interpolate import RegularGridInterpolator
import h5py
h5file = h5py.File('interpolate_test.h5')
x = h5file['x'][:]
y = h5file['y'][:]
z = h5file['z'][:]
mesh_data = h5file['mesh_data'][:,:,:]
my_interpolating_function = RegularGridInterpolator((x, y, z), mesh_data)
pts = np.array([[2.1, 6.2, 8.3], [3.3, 5.2, 7.1]])
print (my_interpolating_function(pts))
Результирующий вывод должен выглядеть следующим образом (что идентично примеру scipy):
[125.80469388 146.30069388]
Для тех, кто использует Pytables API для чтения данных HDF5, здесь есть альтернативный метод для шага 2 выше.Процесс чтения данных похож, только звонки разные.
Запустите этот код для чтения файла HDF5 с помощью Pytables и выполните интерполяцию:
import numpy as np
from scipy.interpolate import RegularGridInterpolator
import tables
h5file = tables.open_file('interpolate_test.h5')
x = h5file.root.x.read()
y = h5file.root.y.read()
z = h5file.root.z.read()
mesh_data = h5file.root.mesh_data.read()
my_interpolating_function = RegularGridInterpolator((x, y, z), mesh_data)
pts = np.array([[2.1, 6.2, 8.3], [3.3, 5.2, 7.1]])
print (my_interpolating_function(pts))
Полученный результат должен быть таким же, как указано выше (и для примера scipy):
[125.80469388 146.30069388]