gpt4 book ai didi

python - PyTables 数据类型对齐问题

转载 作者:太空宇宙 更新时间:2023-11-03 18:33:53 26 4
gpt4 key购买 nike

考虑以下代码:

import os
import numpy as np
import tables as tb

# Pass the field-names and their respective datatypes as
# a description to the table
dt = np.dtype([('doc_id', 'u4'), ('word', 'u4'),
('tfidf', 'f4')], align=True)

# Open a h5 file and create a table
f = tb.openFile('corpus.h5', 'w')
t = f.createTable(f.root, 'table', dt, 'train set',
filters=tb.Filters(5, 'blosc'))

r = t.row
for i in xrange(20):
r['doc_id'] = i
r['word'] = np.random.randint(1000000)
r['tfidf'] = rand()
r.append()
t.flush()

# structured array from table
sa = t[:]

f.close()
os.remove('corpus.h5')

我传入了一个对齐的 dtype 对象,但是当我观察 sa 时,我得到以下结果:

print dt
print "aligned?", dt.isalignedstruct
print
print sa.dtype
print "aligned?", sa.dtype.isalignedstruct

>>>

{'names':['doc_id','word','tfidf'], 'formats':['<u4','<u4','<f4'], 'offsets':[0,4,8], 'itemsize':12, 'aligned':True}
aligned? True

[('doc_id', '<u4'), ('word', '<u4'), ('tfidf', '<f4')]
aligned? False

结构化数组未对齐。目前没有方法在 PyTables 中强制对齐,或者我做错了什么?

编辑:我注意到我的问题类似于 this one ,但我复制并尝试了它提供的答案,但它也不起作用。

<小时/>

Edit2:(请参阅下面 Joel Vroom 的回答)

我复制了 Joel 的答案并进行了测试,看看它是否真正通过 Cython 解压。结果是:

In [1]: %load_ext cythonmagic

In [2]: %%cython -f -c=-O3
...: import numpy as np
...: cimport numpy as np
...: import tables as tb
...: f = tb.openFile("corpus.h5", "r")
...: t = f.root.table
...: cdef struct Word: # notice how this is not packed
...: np.uint32_t doc_id, word
...: np.float32_t tfidf
...: def main(): # <-- np arrays in Cython have to be locally declared, so put array in a function
...: cdef np.ndarray[Word] sa = t[:3]
...: print sa
...: print "aligned?", sa.dtype.isalignedstruct
...: main()
...: f.close()
...:
[(0L, 232880L, 0.2658001184463501) (1L, 605285L, 0.9921777248382568) (2L, 86609L, 0.5266860723495483)]
aligned? False

最佳答案

目前无法在 PyTables 中对齐数据:(
在实践中,我做了以下两件事之一来解决这个问题:

  1. 我执行了一个额外的步骤 --> np.require(sa, dtype=dt, requirements='ACO')
  2. 我在数据类型描述中排列字段,使它们对齐。

作为第二个选项的示例,假设我有以下数据类型:
dt = np.dtype([('f1', np.bool),('f2', '<i4'),('f3', '<f8')], align=True)

如果您打印dt.descr您将看到添加了一个空白空间来对齐数据:
dt.descr >>> [('f1', '|b1'), ('', '|V3'), ('f2', '<i4'), ('f3', '<f8')]

但是,如果我像这样订购我的数据类型(最大到最小字节):
dt = np.dtype([('f3', '<f8'), ('f2', '<i4'), ('f1', np.bool)])
现在,无论我是否指定 align = True/False,数据都会对齐。 .

如果我错了,请有人纠正我,但即使 dt.isalignedstruct = False如果已按上图所示订购,则在技术上已对齐。这在我需要将对齐数据发送到 C 的应用程序中对我有用。

在您提供的示例中,即使 sa.dtype.isalignedstruct = False鉴于
dt.descr = [('doc_id', '<u4'), ('word', '<u4'), ('tfidf', '<f4')]
sa.dtype.descr = [('doc_id', '<u4'), ('word', '<u4'), ('tfidf', '<f4')]
sa数组已对齐(描述中未添加空白空格)。

关于python - PyTables 数据类型对齐问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21926238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com