Python:按元素比较数组的最快方法

标签 python arrays numpy

我正在寻找在 Python 中输出两个数组的第一个差分索引的最快方法。例如,让我们采用以下两个数组:

test1 = [1, 3, 5, 8]
test2 = [1]
test3 = [1, 3]

比较test1test2,我想输出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_longestNone 或提供的填充值填充较短的列表。如果差异是由不同的列表长度而不是列表中的实际不同值引起的,则标准 zip 不起作用。

在 Python 2 上使用 izip_longest

更新:创建了唯一的填充值以避免将 None 作为列表值的潜在问题。 object() 是唯一的:

>>> o1 = object()
>>> o2 = object()
>>> o1 == o2
False

这种纯 Python 方法可能比 NumPy 解决方案更快。这取决于实际数据和其他情况。

  1. 将列表转换为 NumPy 数组也需要时间。这实际上可能 比使用上述函数查找索引花费的时间更长。如果你不是 将使用 NumPy 数组进行其他计算,转换 可能会导致相当大的开销。

  2. NumPy 总是搜索整个数组。如果差异来得早, 你做了比你需要做的更多的工作。

  3. NumPy 创建了一堆中间数组。这会消耗内存和时间。

  4. NumPy 需要构造具有最大长度的中间数组。 在这里比较许多小数组和非常大的数组是不利的。

一般来说,在许多情况下,NumPy 比纯 Python 解决方案更快。 但是每种情况都有点不同,有些情况下纯 Python 更快。

关于Python:按元素比较数组的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30154488/

相关文章:

javascript - 在数组中搜索以 JavaScript 中的某些字符结尾的值

javascript - 如果在数组中发现重复项,必须通过纯 javascript 添加带有键的索引

python - 如何仅在 Pandas 数据框的选定行和列上应用函数?

python - YOLOv4注释将维度保存在[0,1]浮点区间中

python - Sklearn 多类数据集加载

php - 将 PHP 数据数组传递给 Google Maps Javascript API

python - 如何解释 Keras 中 model.predict() 的输出

python - scipy 中正常值的数值积分

python - 当行数或列数为单位时,使用两个索引来引用子图轴

python - 需要 : FFT implememtatin in Python using preallocated buffer to store results