自动打开 hdf5 文件你好,
我正在尝试创建一个 .jsl 脚本,该脚本将从 Tensorflow 导入 hdf5 文件,确定有多少文件(内核 + 偏差)并将它们保存为数据表,然后将其转换为 JMP 可读且可用作代理的形式。 到目前为止,我打开数据表的方式非常手动;我用
Open( "filename.h5", {"list_of", "dataset_names"});
导入所有数据集名称。 但是,为了能够使用数据表,我使用这种手动方式(这是针对 Keras 2 层 ANN,最后一个内核和偏置层将其他内核连接在一起):
layer_0_bias = Data Table( "-model_weights-dense-dense-bias-0" ) << Get As Matrix();
layer_0_kernel = Data Table( "-model_weights-dense-dense-kernel-0" ) << Get As Matrix();
layer_1_bias = Data Table( "-model_weights-dense_1-dense_1-bias-0" ) << Get As Matrix();
layer_1_kernel = Data Table( "-model_weights-dense_1-dense_1-kernel-0" ) << Get As Matrix();
layer_2_bias = Data Table( "-model_weights-dense_2-dense_2-bias-0" ) << Get As Matrix();
layer_2_kernel = Data Table( "-model_weights-dense_2-dense_2-kernel-0" ) << Get As Matrix();
我想要做的是自动化导入、保存数据表和重命名它们的过程,并了解 Keras 模型中有多少层(数据表数 / 2)。 有没有办法了解有多少个数据表,并分别重命名每个数据表,而无需执行上面显示的手动过程?
谢谢!
Re: 自动打开 hdf5 文件对不起,鲍勃,但我现在没有任何这样的示例代码,也没有真正的时间来开发它。
布赖恩
Re: 自动打开 hdf5 文件嗨,布赖恩,
我只找到了一种从 Python 生成 HDF5 文件的方法,JMP 可以直接将其读入表格格式……这意味着 GUI 向导不会询问我要加载 HDF 结构的哪个子集。我不想粘贴所有代码,但基本路径是将 Pandas 数据帧转换为 Numpy recarray,并将其写入 HDF5。
但是......在 JMP 中打开这个 .H5 文件的速度非常慢。对于中等大小的文件(131k 行 x 500 列),它比存储为 CSV 的相同数据慢约 10 倍。
您能否提供示例 Python 代码,将表格数据存储在 JMP 可以直接解释和打开的 HDF5 文件中,并具有合理的数据量性能?或者编写 .JMP 文件的 Python 模块会很棒。
Python 界面似乎将 Pandas 数据框保存为 .csv 以在 JMP 中打开......希望这不是因为 .csv 是最快的中介。
谢谢,
- 鲍勃
Re: 自动打开 hdf5 文件不幸的是,我仍然没有找到解决方案。 这不是我的应用程序的主要功能,所以我不会再打扰了。 但是,如果我碰到什么东西,我肯定会通知的!
Re: 自动打开 hdf5 文件如果我确定找到解决方案,我会分享它。 然而到目前为止还没有运气。
Re: 自动打开 hdf5 文件您是对的,因为 JMP 假定 .h5 是 HDF5 文件的唯一扩展名。这似乎是常态,但 .hdf5 和 .hdf 是公认的替代方案。我们将看到有关获取文件对话框和 JSL 打开命令以支持 JMP 15.2 中的 .hdf5 和 .hdf 扩展名的信息。当然它会在 16.0 中。
布莱恩·科科伦
JMP开发
Re: 自动打开 hdf5 文件实际上这里还有另一个问题 - JMP 似乎假设 HDF5 文件将使用扩展名“h5”。 如果我的文件有不同的扩展名,比如“hdf5”,我可以强制 JMP 通过 Open() 命令使用该文件类型吗? File Type() 参数似乎不适用于 HDF5。Re: 自动打开 hdf5 文件谢谢回复。 至少对我来说,如果我可以查询 HDF5 文件的结构,我很乐意自己编写其余的脚本。Re: 自动打开 hdf5 文件JMP 目前并未真正为 HDF5 提供丰富的 JSL 功能集。我们有开放的功能请求,以添加 JSL 支持以查询表名并合并类似的数据集。我们正在考虑为未来添加这些内容。如果除此之外还有您认为有帮助的支持,请将其传达给技术支持,这将有助于我们确定未来工作的优先级。
谢谢,很抱歉,我们现在不能提供更多帮助。
布莱恩·科科伦
JMP开发
Re: 自动打开 hdf5 文件你好,
我也希望对 hdf5 文件做类似的事情——获取“数据集”的数量和名称,并用它做一些智能的事情。 我确信您已经发现该领域的文档非常稀少。 我通过电子邮件向 jmp 支持部门询问是否这样做,如果我收到任何回复,我会在此处发布。 如果您最终自己解决了这个问题,您能否分享您的解决方案?
谢谢!回复:自动打开 hdf5 文件2024 年讨论,类似主题:
关于打开 hdf5 文件的帮助
回复:自动打开 hdf5 文件直到 JMP 17 版本,Pandas 数据框才会保存为 CSV 文件。JMP 18 及其内置的 Python 支持可以从 Pandas 数据框在内存中创建数据表。在 18 版本中,您必须遍历数据框并一次构建一个 JMP 数据表列。
JMP 19 EA-5 即将推出更好的数据框支持。
用于处理 HDF5 文件的 Python 包是 h5py。
回复:自动打开 hdf5 文件我花了点时间进行修改。下面是一个 Python 脚本,利用jmp和h5py导入包打开“Big Class.jmp”,创建一个“Big Class.h5”文件,然后从 .h5 文件创建一个 dt2 数据表。
# File: h5_example.py
# Author: Paul R. Nelson
# Description: Example showing use of h5py and jmp packages to
# create a .h5 file from a JMP data table, and recreate the JMP
# table from the .h5 file. Note: the HDF5 file doesn't preserve
# column order so the new table comes back in alphabetic order
#
# Layout of my .h5 file - using a generic layout so it can always be easily read
# regardless of name.
# Other attrs could be added as needed.
# /table/ group 'table' has attrs['name'] = table name
# /table/col_name
# /table/...
# /table/nth_col_name
#
# /scripts/script_name
# ...
# /scripts/nth_script_name
#
import jmp
#from jmputils import jpip
#jpip('install', 'h5py')
import numpy as np
import h5py as h5
#callable function to use with h5py file.visit()
def printname(name):
print(name)
# Build a hdf5 file from JMP data table. HDF5 is like NumPy and each dataset
# must be homogeneous, so a JMP like table needs to be multiple datasets.
# To make it easy, a dataset per column.
def h5_from_dt(file_path, dt):
"""Build and save an .h5 file at at file_path/dt_name.h5 from dt"""
try:
f = h5.File( file_path + dt.name + '.h5', 'w')
h_tbl = f.create_group( 'table' ) # table data
h_script = f.create_group('scripts') # table scripts
h_tbl.attrs["name"] = dt.name
for col in dt:
if col.dtype == jmp.DataType.Character:
ds = h_tbl.create_dataset( col.name, shape=len(col), dtype=h5.string_dtype())
# I'm cheating - I'm saving the JMP data type so read can determine char type
ds.attrs['jtype'] = 'jmp_Character'
elif col.dtype == jmp.DataType.Numeric:
ds = h_tbl.create_dataset( col.name, shape=len(col), dtype='f8' )
ds.attrs['jtype'] = 'jmp_Numeric'
ds[:] = dt[col.name] # assign dt values to dataset
except Exception as err:
print(f'Error: {err}')
f.close()
return None
return f
def dt_from_h5(file_path):
"""Create a data table from an .h5 file turning datasets to JMP columns"""
f = h5.File(file_path, 'r')
if f and 'table' in f.keys():
print('A dt like h5.')
tbl = f['table']
cols = tbl.keys()
if cols:
print(cols)
col_name = list(cols)[0]
dt = jmp.DataTable('dt2', rows=len( tbl[ col_name ] ) )
for cname in cols:
c = tbl[cname]
print(c)
print(c.dtype)
# My cheat on knowing utf-8 char columns
if c.attrs['jtype'] and c.attrs['jtype'] == 'jmp_Character':
print('char col')
dt.new_column(cname, jmp.DataType.Character)
for x in range( len( c )):
# need to turn byte object back to utf-8 string
dt[cname][x] = c[x].decode('utf-8')
else:
dt.new_column(cname, jmp.DataType.Numeric)
dt[cname] = c
f.close()
return dt
else:
f.close()
return None
f.close()
return None
# open 'Big Class'
dt = jmp.open(jmp.SAMPLE_DATA + 'Big Class.jmp')
try:
# create 'Big Class.h5' file in my home directory
hdf = h5_from_dt(jmp.HOME, dt)
if hdf:
print(list(hdf.keys()))
hdf.visit(printname)
h_tbl = hdf['table']
print( f'Table Name: {h_tbl.attrs['name']}')
print( hdf['table/name'])
print( [x.decode('utf-8') for x in hdf['table/name'] ])
print( hdf[ 'table/weight'])
print( [x.item() for x in hdf['table/weight'] ] )
else:
print('Unable to create .h5 file from data table.')
except Exception as err:
print(f'Error: {err}')
finally:
if hdf:
hdf.close()
dt2 = dt_from_h5( jmp.HOME + 'Big Class.h5')
print(dt2)