当前位置: 首页 > 知识库问答 >
问题:

检查两个numpy阵列是否相同

商俊智
2023-03-14

假设我有一组数组,包括xy,我想检查它们是否相等。一般来说,我可以只使用np.all(x==y)(除了一些我现在忽略的愚蠢的情况)。

但是,这会计算(x==y)的整个数组,这通常是不需要的。我的数组非常大,而且我有很多数组,两个数组相等的概率很小,所以很可能,在all函数返回False之前,我只需要计算(x==y)的一小部分,所以这对我来说不是一个最佳解决方案。

我尝试使用内置的all函数,并结合itertools.izipall(val1==val2 for val1,val2 initertools.izip(x,y))

然而,在两个数组相等的情况下,这似乎要慢得多,总的来说,它仍然不值得在np.all上使用。我假设是因为内置的所有代码的通用性。并且np.all对生成器不起作用。

有没有办法更快地完成我想要的事情?

我知道这个问题类似于之前提出的问题(例如,在元素方面比较两个numpy数组是否相等),但它们具体不包括提前终止的情况。

共有3个答案

步兴德
2023-03-14

嗯,我知道这是一个糟糕的答案,但似乎没有简单的方法。Numpy创作者应该修复它。我建议:

def compare(a, b):
    if len(a) > 0 and not np.array_equal(a[0], b[0]):
        return False
    if len(a) > 15 and not np.array_equal(a[:15], b[:15]):
        return False
    if len(a) > 200 and not np.array_equal(a[:200], b[:200]):
        return False
    return np.array_equal(a, b)

:)

吕自明
2023-03-14

在github上的numpy页面上显然正在讨论向数组比较添加短路逻辑,因此,在未来版本的numpy中可能会提供这种功能。

傅增
2023-03-14

在numpy本机实现之前,您可以编写自己的函数并使用numba jit编译它:

import numpy as np
import numba as nb


@nb.jit(nopython=True)
def arrays_equal(a, b):
    if a.shape != b.shape:
        return False
    for ai, bi in zip(a.flat, b.flat):
        if ai != bi:
            return False
    return True


a = np.random.rand(10, 20, 30)
b = np.random.rand(10, 20, 30)


%timeit np.all(a==b)  # 100000 loops, best of 3: 9.82 µs per loop
%timeit arrays_equal(a, a)  # 100000 loops, best of 3: 9.89 µs per loop
%timeit arrays_equal(a, b)  # 100000 loops, best of 3: 691 ns per loop

最坏情况下的性能(数组相等)相当于np.all,并且在提前停止编译函数的情况下,可能会比np.all好很多。

 类似资料:
  • 我有一个带有shape的numpy数组,第二个数组也带有shape。我不知道如何检查它们是否相同?示例: 1.第一: 第二: 回应:真实 2. 第一: 第二: 答复:错

  • 问题内容: 我想检查numpy数组/矩阵的列中的所有值是否相同。我试图用的的ufunc ,但它似乎不是在所有情况下工作时: 为什么在第二种情况下中间的列也求和,而应该是? 谢谢你的帮助! 问题答案: 将每个值与第一行中的相应值进行比较: 如果该列中的所有值均为True,则该列共享一个公共值: 可以通过微观分析将其应用于以下情况时可以看到的问题: 前两项,并经过相等性测试,结果为: 现在,经过测试是

  • 问题内容: 我收到了2个轮廓(和)。我怎么知道它们是否相交?我不需要坐标,我只需要一个布尔值或。 我尝试了不同的方式,并且已经尝试与 …但是得到的错误是数组没有方法“ Area()” 问题答案: 一旦有了的两个轮廓,就可以使用按位运算来检测相交。具体来说,我们可以使用。想法是为每个轮廓创建两个单独的图像,然后对它们使用逻辑运算。具有正值(或)的任何点都将是交点。因此,由于您只想获取是否存在相交的布

  • 我有一个String类型的数组列表和一个Person类型的数组列表。其中,Person是一个仅包含包含名称的字符串的对象。 假设我这样做, 假设创建一个新的Person对象会将名称设置为“Josh”,并假设Person类具有该名称的get方法。 有没有办法检查名称数组列表中是否包含名为Josh的人。 我唯一能想到的就是这个, 现在,如果Person数组列表和names数组列表包含多个元素,如何检查

  • 问题内容: 我想检查两个数组是否相等。我的意思是:相同的大小,相同的索引,相同的值。我怎样才能做到这一点? 根据用户的建议,如果数组中的至少一个元素不同,我希望以下内容可以打印 enter ,但实际上没有。 问题答案: $arraysAreEqual = ($a == $b); // TRUE if $a and $b have the same key/value pairs. $arraysA

  • 问题内容: 我想知道如何检查两个功能是否相同。一个示例将评估为true。据我所知,Python将检查函数是否在内存中占据相同的位置,而不是它们是否具有相同的操作。我知道拥有该功能似乎不切实际。 另一个解决方案是我可以在函数上运行以查看其包含的内容或工作方式的某些方法。因此,其中一种将返回该方法的工作方式,可能是在字典中还是在某种形式中。 我希望得到一个答案,但我怀疑这是可能的。 问题答案: 如果您