检查numpy数组列表是否相等

qcbq4gxm  于 2022-12-13  发布在  其他
关注(0)|答案(5)|浏览(155)

我有一个numpy数组的列表,我想检查所有的数组是否相等。最快的方法是什么?
我知道numpy.array_equal函数(https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.array_equal.html),但是据我所知,这只适用于两个数组,我想对N个数组进行相互检查。
我还找到了这个答案来测试列表中的所有元素:check if all elements in a list are identical。但是,当我尝试接受的答案中的每个方法时,我得到一个异常(ValueError:具有多个元素的数组的真值不明确。请使用.any()或.all())
谢谢你,

e5nqia27

e5nqia271#

您可以简单地使用adapt a general iterator method进行数组比较

def all_equal(iterator):
  try:
     iterator = iter(iterator)
     first = next(iterator)
     return all(np.array_equal(first, rest) for rest in iterator)
  except StopIteration:
     return True

如果这不起作用,则意味着您的数组 * 不 * 相等。

  • 演示版 *:
>>> i = [np.array([1,2,3]),np.array([1,2,3]),np.array([1,2,3])]
>>> print(all_equal(i))
True
>>> j = [np.array([1,2,4]),np.array([1,2,3]),np.array([1,2,3])]
>>> print(all_equal(j))
False
flmtquvp

flmtquvp2#

可以在列表解析中使用np.array_equal()来比较每个数组与第一个数组:

all([np.array_equal(list_of_arrays[0], arr) for arr in list_of_arrays])
8e2ybdfx

8e2ybdfx3#

如果您得阵列大小相同,则此解决方案使用numpy_indexed(免责声明:我是它的作者)应该工作和非常有效:

import numpy_indexed as npi
npi.all_unique(list_of_arrays)
edqdpe6u

edqdpe6u4#

@jtr的回答很棒,但我想建议一个稍微不同的替代方案。
首先,我认为使用array_equal不是一个好主意,因为你可能有两个浮点数组,也许你最终会有你愿意容忍的非常小的差异,但是array_equal返回True当且仅当两个数组具有相同的形状和完全相同的元素时。所以让我们使用allclose来代替。允许选择满足需要的绝对和相对公差。
然后,我将使用内置的zip函数,这使得代码更加优雅。
代码如下:

all([np.allclose(array, array_expected), for array, array_expected in zip(array_list, array_list_expected)])
tjrkku2a

tjrkku2a5#

我想你可以使用函数unique。
http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.unique.html#numpy.unique
如果数组中的所有子数组都相同,则只返回一项。
这里更好地描述了如何使用它。
Find unique rows in numpy.array

相关问题