我试图确定在不同的numpy orderdict对象中保存的两个值是否相同。
两个字典都是通过使用fetchallnumpy()
中的turbodbc
选项创建的,并且由两个键组成。第一个键是一个id字段,第二个键是一个可变长度的字符串值。我想看看第二组字典项中是否存在第一组字典项中的字符串值。
可能值得注意的是,两个字典对象在每个键下都拥有大约6000万个值。
到目前为止,我已经尝试了几种方法:-
np.isin(dict1[str_col],dict2[str_col])
作为函数,但这非常慢,大概是因为字符串值存储为dtype
对象。
我尝试将两个字典对象都转换为具有显式字符串类型为numpy
的{{1}}数组,然后尝试使用np.asarray(dict1[str_col], dtype='S500')
和isin
函数。此时,系统用完了RAM。已将“ S500”换成in1d
,但仍然得到dtype=np.string_
。 MemoryError
,同时执行(ar=np.concatenate((ar1,ar2)))
功能。
我也尝试了for循环。
isin
同样,这非常慢。
我的目的是要有一种相对快速的方法来测试两个字符串 列而不会用完内存。
其他位 从长远来看,当我试图识别>新值和已更改的值时,我将运行多个检查。
字典A =当前数据['ID':[int,int,int]] 字典B =历史数据['record':[str,str,str]]
所以我感兴趣的是:-
到目前为止,我发现的最快的最后两个元素是将id列传递给包含np.isin(arr1,arr2)的函数。平均需要15秒才能比较数据。
答案 0 :(得分:0)
您可以使用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]])
答案 1 :(得分:0)
仍然不能完全清楚您要达到的目标(请参阅我的评论)。但是,这是我的短裤。
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数据直接转储到熊猫对象(to_pandas()
)中。看到这里:turbodbc documentation, advanced usage