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万元素的任何地方…并且可能需要多次运行。我用的是"如果我不是在所有的missidx "而不是说"……"如果我在所有的总统"因为缺失值肯定是要扫描的小得多的子集。此外,我相信它没有帮助,缺失a和缺失b必须重新配置的结构,np.argwhere()自然返回,但这真的是瓶颈在这里吗?

任何帮助都将非常感激!由于

假设源向量与另一个解完全相同:

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])

您可以使用PandasonicIndex执行任务以及它的交集方法。甚至可以将其写成如下一行代码:

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

结果是:

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

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

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

这种方法的优点是可以避免任何列表推导式,因此,这段代码应该比您的代码运行得快得多。在更大的数据样本上自己检查一下。

相关内容

最新更新