假设我有一个形状=(2,500,000,M)的熊猫数据帧和一个scipy csr稀疏形状矩阵(2,500,000,N)。
数据帧和稀疏矩阵的每一行描述一个实体。它们已被排序,使得数据帧的第1行描述也在稀疏矩阵的第1行中找到的实体。那么现在数据帧有一个快速的过滤机制(catalogue.where(catalogue.some_column != ''
),但是如何在给定过滤数据帧的情况下在稀疏矩阵中找到相应的行?
假设数据帧称为catalogue
,稀疏矩阵称为collection
def collection_filter_row(catalogue_filtered, catalogue_index_full, collection):
return scipy.sparse.vstack(ThreadPool(100).map(
functools.partial(collection_get_row,
catalogue_index=tuple(catalogue_index_full),
collection=collection),
tuple(catalogue_filtered.index.values)))
def collection_get_row(document_id, catalogue_index, collection):
return collection.getrow(catalogue_index.index(document_id))
collection_partial = partial(
collection_filter_row,
catalogue_index_full=catalogue.index.values,
collection=pickle.load(open('collection-tfidf', 'rb')))
criteria = catalogue['criteria'].where(catalogue.criteria != '')
collection_state = collection_partial(criteria)
但是即使使用任何类型的多处理(gevent,threadpool),选择相应的行仍然很慢,我做错了什么(或者更确切地说,是否有更快的方法)?
答案 0 :(得分:1)
以某种方式找到了解决此问题的更快方法。首先创建catalogue
index =>字典collection
索引。
index_dict = dict(zip(
catalogue.index.values.tolist(),
range(collection.shape[0])))
然后我的collection_filter_row
变为
def collection_filter_row(catalogue_filtered, index_dict, collection):
return collection[[index_dict[document_id]
for document_id
in catalogue_filtered.index.values.tolist()]]
为了返回集合的子集,而不是使用catalogue.where()
我应该使用catalogue.loc[catalogue.some_column != '']
,因此正确调用collection_filter_row
collection_sub = collection_filter_row(
catalogue.loc[catalogue.some_column != ''],
index_dict,
collection)
比问题中显示的原始方法快得多