自動打開 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)。 有沒有一種方法可以了解有多少個數據表,並且可以單獨重命名每個數據表,而無需執行上面所示的手動過程?
謝謝!
回复:自動打開 hdf5 文件很抱歉鮑勃,但我沒有任何此類示例代碼,或者現在確實沒有時間開發它。
布萊恩
回复:自動打開 hdf5 文件嗨布萊恩,
我只找到了一種從 Python 生成 HDF5 文件的方法,JMP 可以直接將其讀取為表格格式...這意味著 GUI 嚮導不會詢問我要加載 HDF 結構的哪個子集。我不想粘貼所有代碼,但基本路徑是將 Pandas 數據幀轉換為 Numpy 記錄,並將其寫入 HDF5。
但是...在 JMP 中打開這個 .H5 文件實在是太慢了。對於中等大小的文件(131k 行 x 500 列),它比存儲為 CSV 的相同數據慢大約 10 倍。
您能否提供示例 Python 代碼,該代碼將類似表格的數據存儲在 JMP 可以直接解釋和打開的 HDF5 文件中,並且對於數據量而言具有合理的性能?或者編寫 .JMP 文件的 Python 模塊也很棒。
Python 界面似乎將 Pandas 數據幀另存為 .csv 以在 JMP 中打開...希望這不是因為 .csv 是最快的中介。
謝謝,
- 鮑勃
回复:自動打開 hdf5 文件不幸的是我仍然沒有找到解決方案。 這不是我的應用程序的主要功能,所以我不會再打擾了。 但如果我遇到什麼事情我肯定會通知!
回复:自動打開 hdf5 文件如果我確定找到解決方案,我會分享它。 然而到目前為止還沒有運氣。
回复:自動打開 hdf5 文件您是對的,JMP 假定 .h5 是 HDF5 文件的唯一擴展名。這似乎確實是常態,但 .hdf5 和 .hdf 是公認的替代品。我們將了解如何獲取文件對話框和 JSL 打開命令以支持 JMP 15.2 中的 .hdf5 和 .hdf 擴展名。當然會是16.0。
布賴恩·科科倫
JMP開發
回复:自動打開 hdf5 文件實際上這裡還有另一個問題 - JMP 似乎假設 HDF5 文件將使用擴展名“h5”。 如果我的文件具有不同的擴展名(例如“hdf5”),我可以通過 Open() 命令強制 JMP 使用該文件類型嗎? File Type() 參數似乎不適用於 HDF5。回复:自動打開 hdf5 文件謝謝回复。 至少對我來說,如果我可以查詢 HDF5 文件的結構,我很樂意自己編寫其餘部分的腳本。回复:自動打開 hdf5 文件JMP 目前並未真正為 HDF5 提供豐富的 JSL 功能集。我們有公開的功能請求,希望添加 JSL 支持來查詢表名稱並合併類似的數據集。我們正在考慮為未來添加這些內容。如果除此之外還有您認為有幫助的支持,請將其傳達給技術支持,這將幫助我們優先考慮未來的工作。
謝謝,很抱歉我們現在無法提供更多幫助。
布賴恩·科科倫
JMP開發
回复:自動打開 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)