【发布时间】:2022-03-31 11:43:45
【问题描述】:
我有一个包含 383milj 行的矩阵,我需要根据值列表 (index_to_remove) 过滤这个矩阵。此功能在 1 次迭代中执行多次。是否有更快的替代方案:
def remove_from_result(matrix, index_to_remove, inv=True):
return matrix[np.isin(matrix, index_to_remove, invert=inv)]
【问题讨论】:
-
@MuhammadAhmad,我不认为
set与np.isin有任何优势。 -
我是否误解了
index_to_remove不是索引列表,而是您的函数删除的值 列表? -
@tif,是的,这是正确的。 index_to_remove 是一个值列表,它们位于矩阵的某个位置。
-
@MuhammadAhmad,是的,输出是“大致等价的”,但方法肯定不是。
-
根据我的实验,
matrix[isin(matrix,to_remove,invert=True)]已经比[i for i in matrix.flat if i not in to_remove]和[filter(lambda i:i not in to_remove,matrix.flat)]快了 >50 倍。这暗示留给优化的空间很小。您可以尝试通过并行化此代码或使用更快的 python 实现来提高性能,例如赛通。
标签: python performance numpy