【发布时间】:2020-12-06 16:05:45
【问题描述】:
希望有人能对此有所了解。我正在尝试学习如何使用 HDF5 文件。不知何故,这个字符串列表作为整数数组编码到文件中,但我无法弄清楚如何去解码它。我可以使用 read_hdf 函数将文件重新插入 pandas,但这不是重点——我试图理解编码逻辑。这里总结的是我正在使用的示例。
smiles.txt =
structure
[11CH2]1NCCN2C[C@@H]3CCC[C@@H]3c4cccc1c24
[11CH2]1NCCN2[C@@H]3CCC[C@@H]3c4cccc1c24
[11CH3]c1ccc(cc1)c2cc(nn2c3ccc(cc3)S(=O)(=O)N)C(F)(F)F
[11CH3]c1ccccc1O[C@H]([C@@H]2CNCCO2)c3ccccc3
[11CH3]c1ccccc1S[C@H]([C@@H]2CNCCO2)c3ccccc3
>>> import pandas as pd
>>> df = pd.read_csv('smiles.txt', header=0)
>>> df.to_hdf('smiles.h5', 'table')
然后我探索新创建的 HDF5 文件的结构:
>>> import h5py
>>> with h5py.File('smiles.h5',"r") as f:
>>> f.visit(print)
table
table/axis0
table/axis1
table/block0_items
table/block0_values
>>> with h5py.File('smiles_temp', 'r') as f:
>>> print(list(f.keys()))
>>> print(f['/thekey/axis0'][:])
>>> print(f['/thekey/axis1'][:])
>>> print(f['/thekey/block0_items'][:])
>>> print(f['/thekey/block0_values'][:])
['thekey']
[b'structure']
[0 1 2 3 4]
[b'structure']
[array([128, 4, 149, 123, 1, 0, 0, 0, 0, 0, 0, 140, 21,
110, 117, 109, 112, 121, 46, 99, 111, 114, 101, 46, 109, 117,
108, 116, 105, 97, 114, 114, 97, 121, 148, 140, 12, 95, 114,
101, 99, 111, 110, 115, 116, 114, 117, 99, 116, 148, 147, 148,
140, 5, 110, 117, 109, 112, 121, 148, 140, 7, 110, 100, 97,
114, 114, 97, 121, 148, 147, 148, 75, 0, 133, 148, 67, 1,
98, 148, 135, 148, 82, 148, 40, 75, 1, 75, 5, 75, 1,
134, 148, 104, 3, 140, 5, 100, 116, 121, 112, 101, 148, 147,
148, 140, 2, 79, 56, 148, 75, 0, 75, 1, 135, 148, 82,
148, 40, 75, 3, 140, 1, 124, 148, 78, 78, 78, 74, 255,
255, 255, 255, 74, 255, 255, 255, 255, 75, 63, 116, 148, 98,
137, 93, 148, 40, 140, 41, 91, 49, 49, 67, 72, 50, 93,
49, 78, 67, 67, 78, 50, 67, 91, 67, 64, 64, 72, 93,
51, 67, 67, 67, 91, 67, 64, 64, 72, 93, 51, 99, 52,
99, 99, 99, 99, 49, 99, 50, 52, 148, 140, 40, 91, 49,
49, 67, 72, 50, 93, 49, 78, 67, 67, 78, 50, 91, 67,
64, 64, 72, 93, 51, 67, 67, 67, 91, 67, 64, 64, 72,
93, 51, 99, 52, 99, 99, 99, 99, 49, 99, 50, 52, 148,
140, 54, 91, 49, 49, 67, 72, 51, 93, 99, 49, 99, 99,
99, 40, 99, 99, 49, 41, 99, 50, 99, 99, 40, 110, 110,
50, 99, 51, 99, 99, 99, 40, 99, 99, 51, 41, 83, 40,
61, 79, 41, 40, 61, 79, 41, 78, 41, 67, 40, 70, 41,
40, 70, 41, 70, 148, 140, 44, 91, 49, 49, 67, 72, 51,
93, 99, 49, 99, 99, 99, 99, 99, 49, 79, 91, 67, 64,
72, 93, 40, 91, 67, 64, 64, 72, 93, 50, 67, 78, 67,
67, 79, 50, 41, 99, 51, 99, 99, 99, 99, 99, 51, 148,
140, 44, 91, 49, 49, 67, 72, 51, 93, 99, 49, 99, 99,
99, 99, 99, 49, 83, 91, 67, 64, 72, 93, 40, 91, 67,
64, 64, 72, 93, 50, 67, 78, 67, 67, 79, 50, 41, 99,
51, 99, 99, 99, 99, 99, 51, 148, 101, 116, 148, 98, 46],
dtype=uint8)]
如何使用 h5py 返回字符串列表?
【问题讨论】:
-
我的问题更多是关于模式而不是内容。根据
smiles.txt的内容,您希望在 HDF5 文件中找到什么?您希望它如何组织?也许更重要的是,您对“微笑”数据的下游用途是什么? -
我希望看到或轻松提取/解码字符串的一些可读表示。我的兴趣源于试图了解转换是如何完成的。显然这是一个 pandas 实现,只是好奇是否有一种方法可以访问 pandas 之外的字符串列表。如果不清楚文件的生成位置,这可能特别重要。我仍然是这方面的新手,所以我可能会要求一些非常复杂的东西。 SMILES 数据被用作对许多机器学习应用中使用的化学结构信息进行编码的一种方式。
-
我同意,编码与熊猫有关。还有其他方法可以将数据加载到 HDF5 中。它是一个数据容器,几乎可以有任何模式。这就是为什么我问你想做什么。您是否只想要一个字符串数组 - 每行文本 1 个字符串?如果是这样,使用 NumPy CSV 阅读器和 PyTables 或 h5py 可能会更容易。我还添加了 [pandas] 标签。也许熊猫专家可以提供帮助。