如何将 H5 table 查询结果转换为 Astropy Table?
How can I turn an H5 table query result into a Astropy Table?
通常我使用SQL查询在线数据库,但数据库已关闭。我有一个包含我需要查询的 table 的 H5 文件。我使用 Table.read_where('condition')
查询了 table,并为符合我的条件的每一行列出了 numpy.void
元素。有什么方法可以获取该行列表并将其变成 Astropy table?这就是我以前使用的所有代码,我宁愿不必更改它。这是我一直用来尝试将其转换为 Astropy table:
的代码
import tables
from astropy.table import Table
import numpy as np
Data = tables.open_file('file_path','r') #opens our .h5 file
DataTable = Data.root.TableName #Points to the table
#Queries the table for rows that meet my 'Condition', and outputs a list of numpy.void's
#containing integers and floats. Each numpy.void represents a row in my table.
result = [row for row in DataTable.read_where('Condition')]
#I try to turn the list of rows into a Astropy table to use in the rest of my code.
resultTable = Table(rows=result,names=('Column1','Column2','Column3'))
我得到的错误是:
Traceback (most recent call last):
File "<ipython-input-2-aa9501cdbf2a>", line 1, in <module>
runfile('FilePath', wdir='FilePath')
File "Spyder File", line 827, in runfile
execfile(filename, namespace)
File "Spyder File", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "File Path", line 27, in <module>
resultTable = Table(rows=result,names=('Column1','Column2','Column3'))
File "FilePath/python3.7/site-packages/astropy/table/table.py", line 420, in __init__
rec_data = recarray_fromrecords(rows)
File "FilePath/lib/python3.7/site-packages/astropy/table/np_utils.py", line 196, in recarray_fromrecords
return np.rec.fromarrays(array_list, formats=formats)
File "FilePath/lib/python3.7/site-packages/numpy/core/records.py", line 645, in fromarrays
_array[_names[i]] = arrayList[i]
ValueError: Can't cast from structure to non-structure, except if the structure only has a single field.
我尝试通过 np.rec.fromrecords
传递 result
来检查它是否有效,因为 [Astropy 文档] (https://docs.astropy.org/en/stable/table/construct_table.html#construct-table) 说它必须能够通过该函数.它没有任何错误。我不确定从这里到哪里去。
我的替代计划是创建一个由 result
中的行组成的 PyTables table,并从中提取列作为 numpy 数组。我宁愿坚持只使用 Astropy,因为我使用的代码是围绕 Astropy 构建的,坚持使用 Astropy 而不是将其更改为 PyTables 会更容易。
基于documentation for AstroPy Table,第一个参数可以是NumPy结构化数组或一维齐次数组(相同类型)。
PyTables(表)函数 DataTable.read_where('Condition')
returns 匹配 Table 描述的 NumPy 记录数组(在 NumPy 术语中称为 dtype)。因此,您想使用返回的数组来创建您的 AstroPy Table。在 Pytables 调用中不需要 row for row in
;只需使用 result = DataTable.read_where('Condition')
.
注意:默认情况下,astropy.table
将使用 NumPy 数组中的字段名称。您可以使用 (print (result.dtype)
查看它们。添加 names=
参数会使用您提供的名称覆盖默认名称。
更新后的代码显示了以下更改:
Data = tables.open_file('file_path','r') #opens our .h5 file
DataTable = Data.root.TableName #Points to the PyTable table
#Queries the table for rows that meet my 'Condition', and
# returns a NumPy record array with dtype matching the table description
result = DataTable.read_where('Condition')
#reference the Numpy Array to create a AstroPy table for use in the rest of my code.
resultTable = Table(rows=result,names=('Column1','Column2','Column3'))
通常我使用SQL查询在线数据库,但数据库已关闭。我有一个包含我需要查询的 table 的 H5 文件。我使用 Table.read_where('condition')
查询了 table,并为符合我的条件的每一行列出了 numpy.void
元素。有什么方法可以获取该行列表并将其变成 Astropy table?这就是我以前使用的所有代码,我宁愿不必更改它。这是我一直用来尝试将其转换为 Astropy table:
import tables
from astropy.table import Table
import numpy as np
Data = tables.open_file('file_path','r') #opens our .h5 file
DataTable = Data.root.TableName #Points to the table
#Queries the table for rows that meet my 'Condition', and outputs a list of numpy.void's
#containing integers and floats. Each numpy.void represents a row in my table.
result = [row for row in DataTable.read_where('Condition')]
#I try to turn the list of rows into a Astropy table to use in the rest of my code.
resultTable = Table(rows=result,names=('Column1','Column2','Column3'))
我得到的错误是:
Traceback (most recent call last):
File "<ipython-input-2-aa9501cdbf2a>", line 1, in <module>
runfile('FilePath', wdir='FilePath')
File "Spyder File", line 827, in runfile
execfile(filename, namespace)
File "Spyder File", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "File Path", line 27, in <module>
resultTable = Table(rows=result,names=('Column1','Column2','Column3'))
File "FilePath/python3.7/site-packages/astropy/table/table.py", line 420, in __init__
rec_data = recarray_fromrecords(rows)
File "FilePath/lib/python3.7/site-packages/astropy/table/np_utils.py", line 196, in recarray_fromrecords
return np.rec.fromarrays(array_list, formats=formats)
File "FilePath/lib/python3.7/site-packages/numpy/core/records.py", line 645, in fromarrays
_array[_names[i]] = arrayList[i]
ValueError: Can't cast from structure to non-structure, except if the structure only has a single field.
我尝试通过 np.rec.fromrecords
传递 result
来检查它是否有效,因为 [Astropy 文档] (https://docs.astropy.org/en/stable/table/construct_table.html#construct-table) 说它必须能够通过该函数.它没有任何错误。我不确定从这里到哪里去。
我的替代计划是创建一个由 result
中的行组成的 PyTables table,并从中提取列作为 numpy 数组。我宁愿坚持只使用 Astropy,因为我使用的代码是围绕 Astropy 构建的,坚持使用 Astropy 而不是将其更改为 PyTables 会更容易。
基于documentation for AstroPy Table,第一个参数可以是NumPy结构化数组或一维齐次数组(相同类型)。
PyTables(表)函数 DataTable.read_where('Condition')
returns 匹配 Table 描述的 NumPy 记录数组(在 NumPy 术语中称为 dtype)。因此,您想使用返回的数组来创建您的 AstroPy Table。在 Pytables 调用中不需要 row for row in
;只需使用 result = DataTable.read_where('Condition')
.
注意:默认情况下,astropy.table
将使用 NumPy 数组中的字段名称。您可以使用 (print (result.dtype)
查看它们。添加 names=
参数会使用您提供的名称覆盖默认名称。
更新后的代码显示了以下更改:
Data = tables.open_file('file_path','r') #opens our .h5 file
DataTable = Data.root.TableName #Points to the PyTable table
#Queries the table for rows that meet my 'Condition', and
# returns a NumPy record array with dtype matching the table description
result = DataTable.read_where('Condition')
#reference the Numpy Array to create a AstroPy table for use in the rest of my code.
resultTable = Table(rows=result,names=('Column1','Column2','Column3'))