gpt4 book ai didi

python - 查看 numpy OrderedDict 中的值是否与另一个 OrderedDict 中的值相同的最快方法是什么?

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

我试图确定不同 numpy orderdict 对象中保存的两个值是否相同。

这两个字典都是通过使用 turbodbc 中的 fetchallnumpy() 选项创建的,并且包含两个键。第一个键是 id 字段,第二个键是可变长度的字符串值。我想查看第一组字典项目中的字符串值是否存在于第二组字典项目中。

可能值得注意的是,两个字典对象的每个键下都保存了大约 6000 万个值。

到目前为止我已经尝试了几件事:-

  1. np.isin(dict1[str_col],dict2[str_col])

    作为一个函数,但这非常慢,可能是因为字符串值存储为 dtype 对象。

  2. 我尝试将两个字典对象转换为 numpy 数组,并将显式字符串类型设置为 np.asarray(dict1[str_col], dtype='S500'),然后尝试使用 isinin1d 函数。此时系统将耗尽 RAM。已将“S500”替换为 dtype=np.string_,但仍然出现 MemoryError(ar=np.concatenate((ar1,ar2))) 同时执行 isin 函数。

  3. 我还尝试了 for 循环。

    [r in dict2[str_col] for r in dict1[str_col]]

    这又非常慢。

My aim is to have a relatively quick way of testing the two string columns without running out of memory.

额外位 从长远来看,当我试图识别新值和已更改的值时,我将运行不止一项检查。

字典 A = 当前数据 ['ID': [int,int,int]] 字典 B = 历史数据 ['record':[str,str,str]]

所以我感兴趣的是:-

  • A != B(当前记录与历史记录不同)
  • A 不存在于 B 中(新记录添加到数据库中)
  • B 不存在于 A 中(需要编辑记录)

到目前为止,我发现的最后两个元素最快的方法是将 id 列传递给包含 np.isin(arr1,arr2) 的函数。比较数据平均需要 15 秒。

最佳答案

仍然不完全清楚您想要实现的目标(请参阅我的评论)。但这是我的短片。

Pandas可以提供一种更有效的替代方法来比较字符串列表。我自己还没有针对大块数据进行过测试。

尝试以下操作:

import pandas as pd
s1 = pd.Series(dict1[str_col])
s2 = pd.Series(dict2[str_col])
print(s1.isin(s2).all())

或者,如果您无论如何都需要迭代所有列,您可以将完整的字典转换为数据框:

df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)
for col in df1:
print(df1[col].isin(df2[col]).all())

如果你想测试整个DataFrame的相等性,你可以使用pandas' assert_frame_equal 。例如:

 pd.util.testing.assert_frame_equal(df1, df2)     
# ...or if the ordering is not the same.
pd.util.testing.assert_frame_equal(df1, df2, check_like=True)

显然,可以将turbodbc数据直接转储到pandas对象中(to_pandas())。参见这里:turbodbc documentation, advanced usage

关于python - 查看 numpy OrderedDict 中的值是否与另一个 OrderedDict 中的值相同的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55833558/

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