gpt4 book ai didi

python - PyTables 问题 - 迭代表的子集时出现不同的结果

转载 作者:太空宇宙 更新时间:2023-11-03 13:24:42 25 4
gpt4 key购买 nike

我是 PyTables 的新手,正在考虑使用它来处理从基于代理的建模模拟生成并存储在 HDF5 中的数据。我正在处理一个 39 MB 的测试文件,并且遇到了一些奇怪的情况。这是表格的布局:

    /example/agt_coords (Table(2000000,)) ''
description := {
"agent": Int32Col(shape=(), dflt=0, pos=0),
"x": Float64Col(shape=(), dflt=0.0, pos=1),
"y": Float64Col(shape=(), dflt=0.0, pos=2)}
byteorder := 'little'
chunkshape := (20000,)

这是我在 Python 中访问它的方式:

from tables import *
>>> h5file = openFile("alternate_hose_test.h5", "a")

h5file.root.example.agt_coords
/example/agt_coords (Table(2000000,)) ''
description := {
"agent": Int32Col(shape=(), dflt=0, pos=0),
"x": Float64Col(shape=(), dflt=0.0, pos=1),
"y": Float64Col(shape=(), dflt=0.0, pos=2)}
byteorder := 'little'
chunkshape := (20000,)
>>> coords = h5file.root.example.agt_coords

现在事情变得奇怪了。

[x for x in coords[1:100] if x['agent'] == 1]
[(1, 25.0, 78.0), (1, 25.0, 78.0)]
>>> [x for x in coords if x['agent'] == 1]
[(1000000, 25.0, 78.0), (1000000, 25.0, 78.0)]
>>> [x for x in coords.iterrows() if x['agent'] == 1]
[(1000000, 25.0, 78.0), (1000000, 25.0, 78.0)]
>>> [x['agent'] for x in coords[1:100] if x['agent'] == 1]
[1, 1]
>>> [x['agent'] for x in coords if x['agent'] == 1]
[1, 1]

我不明白为什么当我遍历整个表时值被搞砸了,但当我只取整组行的一小部分时却没有。我确定这是我使用该库的方式的错误,因此我们将不胜感激在此问题上的任何帮助。

最佳答案

这是遍历 Table 对象时非常常见的混淆点,

当您遍历 Table 时,您获得的项目类型不是项目中的数据,而是当前行中表的访问器。所以用

[x for x in coords if x['agent'] == 1]

您创建了一个行访问器列表,这些访问器都指向表的“当前”行,即最后一行。但是当你这样做的时候

[x["agent"] for x in coords if x['agent'] == 1]

您在构建列表时使用访问器。

通过在每次迭代中使用访问器,在构建列表时获取所需的所有数据的解决方案。有两种选择

[x[:] for x in coords if x['agent'] == 1]

[x.fetch_all_fields() for x in coords if x['agent'] == 1]

前者构建一个元组列表。后者返回一个 NumPy void 对象。 IIRC,第二个更快,但前者可能对您的目的更有意义。

这是 a good explanation来自 PyTables 开发人员。 In future releases, printing a row accessor object may not simply show the data, but state that it's a row accessor object .

关于python - PyTables 问题 - 迭代表的子集时出现不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1929973/

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