我试图确定在不同的numpy ordereddict对象中保存的两个值是否相同。
这两个词典都是使用fetchallnumpy()
中的turbodbc
选项创建的,由两个键组成。第一个键是id字段,第二个键是可变长度的字符串值。我想看看第一组字典项中的字符串值是否存在于第二组字典项中。
值得注意的是,两个字典对象在每个键下都保存了大约6000万个值。
到目前为止我已经尝试了几件事: -
np.isin(dict1[str_col],dict2[str_col])
作为一个函数,但这非常慢,大概是因为字符串值存储为dtype
对象。numpy
数组,其显式字符串类型为np.asarray(dict1[str_col], dtype='S500')
,然后尝试使用isin
和in1d
函数。此时系统耗尽RAM。已经将'S500'换成了dtype=np.string_
,但仍然获得了MemoryError
。 (ar=np.concatenate((ar1,ar2)))
执行isin
功能。[r in dict2[str_col] for r in dict1[str_col]]
这又是非常缓慢的。我的目标是有一个相对快速的方法来测试两个字符串列而不会耗尽内存。
额外的位从长远来看,我将运行多个检查,因为我正在尝试识别>已更改的新值和值。
字典A =当前数据['ID':[int,int,int]]字典B =历史数据['record':[str,str,str]]
所以我感兴趣的是: -
到目前为止,我发现最快的方法是将最后两个元素传递给包含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
您可以使用np.searchsorted
进行更快速的搜索:
ar1 = dict1[str_col]
ar2 = dict2[str_col]
sorter = np.argsort(ar2)
idx = np.searchsorted(ar2, ar1, sorter=sorter)
if idx.max() >= len(ar2):
return False
return np.all(ar1 == ar2[sorter[idx]])