【发布时间】:2019-04-24 15:22:31
【问题描述】:
我试图确定不同 numpy orderdict 对象中保存的两个值是否相同。
这两个字典都是使用turbodbc 中的fetchallnumpy() 选项创建的,并且由两个键组成。第一个键是 id 字段,第二个键是可变长度的字符串值。我想看看第一组字典项中的字符串值是否存在于第二组字典项中。
值得注意的是,两个字典对象在每个键下都保存了大约 6000 万个值。
到目前为止我已经尝试了几件事:-
-
np.isin(dict1[str_col],dict2[str_col])作为一个函数,但这非常慢,大概是因为字符串值存储为
dtype对象。 我尝试将两个字典对象转换为具有显式字符串类型为
np.asarray(dict1[str_col], dtype='S500')的numpy数组,然后尝试使用isin和in1d函数。此时系统内存不足。已将“S500”换成dtype=np.string_,但仍获得MemoryError。(ar=np.concatenate((ar1,ar2)))同时执行isin函数。-
我还尝试了一个 for 循环。
[r in dict2[str_col] for r in dict1[str_col]]同样,这非常慢。
我的目标是有一个相对快速的方法来测试这两个字符串 列而不会耗尽内存。
附加位 从长远来看,当我试图识别 > 新值和已更改的值时,我将运行不止一项检查。
字典 A = 当前数据 ['ID': [int,int,int]] 字典 B = 历史数据 ['record':[str,str,str]]
所以我感兴趣的是:-
- A != B(当前记录与历史记录不同)
- B 中不存在 A(新记录已添加到数据库中)
- A 中不存在 B(需要编辑记录)
到目前为止,我发现的最后两个元素最快的方法是将 id 列传递给包含 np.isin(arr1,arr2) 的函数。比较数据平均需要 15 秒。
【问题讨论】:
-
请提供minimal reproducible example。什么,究竟有问题的字典的结构是什么?
-
我对你的问题也有点困惑。您写道“第二个键是可变长度的字符串”,因此如果
dict1[str_col]和dict2[str_col]都是字符串,您只需测试字符串是否相等:str1 == str2。但是,只有在处理嵌套对象时,您的方法才有意义(也就是说,如果dict1[str_col]是另一个字典或列表,或者不是字符串的某个序列)。在这种情况下,您可能想看看这个post。 -
numpy OrderedDict对我来说意义不大。 1) 看起来就像您正在比较两个字典中的值,其中的值是某种 numpy 数组。但如果是这样,什么形状和数据类型? -
您提供的信息还不一致。首先,我认为您应该将问题重新表述为“比较两个字符串列表的最快方法是什么”。在这种情况下,您仍然需要指定更多详细信息:订单是否起作用?列表是排序的,还是以固定顺序显示条目?数据的组织对算法的最佳选择有很大影响。
-
首先感谢您的帮助,其次为我缺乏连贯性和普遍的新奇感而道歉!我会尝试在原始帖子中添加更多细节。
标签: python python-3.x numpy numpy-ndarray