我正在寻找在 Python 中输出两个数组的第一个差分索引的最快方法。例如,让我们采用以下两个数组:
test1 = [1, 3, 5, 8]
test2 = [1]
test3 = [1, 3]
比较test1
和test2
,我想输出1
,而test1和test3比较应该输出2
.
换句话说,我寻找与以下语句等价的内容:
import numpy as np
np.where(np.where(test1 == test2, test1, 0) == '0')[0][0]
具有不同的数组长度。
感谢任何帮助。
最佳答案
对于这个有效的列表:
from itertools import zip_longest
def find_first_diff(list1, list2):
for index, (x, y) in enumerate(zip_longest(list1, list2,
fillvalue=object())):
if x != y:
return index
zip_longest
用 None
或提供的填充值填充较短的列表。如果差异是由不同的列表长度而不是列表中的实际不同值引起的,则标准 zip
不起作用。
在 Python 2 上使用 izip_longest
。
更新:创建了唯一的填充值以避免将 None
作为列表值的潜在问题。 object()
是唯一的:
>>> o1 = object()
>>> o2 = object()
>>> o1 == o2
False
这种纯 Python 方法可能比 NumPy 解决方案更快。这取决于实际数据和其他情况。
将列表转换为 NumPy 数组也需要时间。这实际上可能 比使用上述函数查找索引花费的时间更长。如果你不是 将使用 NumPy 数组进行其他计算,转换 可能会导致相当大的开销。
NumPy 总是搜索整个数组。如果差异来得早, 你做了比你需要做的更多的工作。
NumPy 创建了一堆中间数组。这会消耗内存和时间。
NumPy 需要构造具有最大长度的中间数组。 在这里比较许多小数组和非常大的数组是不利的。
一般来说,在许多情况下,NumPy 比纯 Python 解决方案更快。 但是每种情况都有点不同,有些情况下纯 Python 更快。
关于Python:按元素比较数组的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30154488/