Python:如何更快地发现通用索引?

2024-05-18 05:36:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我提出了以下方法来寻找所有共同的指数,其中值在两个长度相等的向量上存在。我喜欢它的可读性,但我需要它更快

missingA = np.argwhere(np.isnan(vectorA)==True);
missingA = [missingA[ma][0] for ma in range(len(missingA))];

missingB = np.argwhere(np.isnan(vectorB)==True);
missingB = [missingB[mb][0] for mb in range(len(missingB))];

allmissidxs = set(missingA).union(set(missingB)); 
idxs = [idx for idx in range(len(vectorA))   if idx not in allmissidxs];

它肯定能工作,但我需要使用它的向量是从100万到300万个元素…并且可能需要运行多次。我使用“…IfIdx不在allmissidxs中”,而不是说“…IfIdx在allpresidxs中”,因为缺少的值肯定是要扫描的更小的子集。此外,我确信,鉴于np.argwhere()自然返回的结构,必须重新配置missingA和missingB也无济于事,但这真的是这里的瓶颈吗

任何帮助都将不胜感激!谢谢


Tags: intrueforlennprange向量idx
1条回答
网友
1楼 · 发布于 2024-05-18 05:36:27

假设源向量与其他解决方案中的源向量相同:

vectorA = np.array([np.nan, 1., 2., 3.,     np.nan, 5.,     np.nan, 7.,
    8., np.nan])
vectorB = np.array([0.,     1., 2., np.nan, 4.,     np.nan, 6.,     np.nan,
    8., np.nan])

您可以使用Pandasonic索引及其交叉方法来完成任务。 甚至可以将其写成以下一行:

result = pd.Index(vectorA).intersection(vectorB)

结果是:

Float64Index([1.0, 2.0, 8.0], dtype='float64')

如果希望将结果作为Numpy向量,请将.values附加到上述代码中 结果将是:

array([1., 2., 8.])

这种方法的优点是避免了任何列表理解, 因此,此代码的运行速度应该比您的代码快得多。 在更大的数据样本上自己检查

相关问题 更多 >