Python 比较NumPy数组的两个(嵌套)列表/元组

Python 比较NumPy数组的两个(嵌套)列表/元组,python,arrays,numpy,tuples,Python,Arrays,Numpy,Tuples,假设我有两个嵌套结构,类型如下: [(array, (array, array, array)), (array, (array, array, array))] 里面所有有趣的数据都是NumPy数组。比较这两种数据结构的最简单方法是什么?我可以单独索引和比较每个对应的数组,但这需要大量的索引和键入 如果有一种简单的方法可以“吞咽”所包含数组中的所有数字,并将它们明确地“序列化”到一个NumPy数组中,那么生成的数组将很容易比较。我主要感兴趣的是检查两个这样的数组是否相等(=或np.allcl

假设我有两个嵌套结构,类型如下:

[(array, (array, array, array)), (array, (array, array, array))]
里面所有有趣的数据都是NumPy数组。比较这两种数据结构的最简单方法是什么?我可以单独索引和比较每个对应的数组,但这需要大量的索引和键入


如果有一种简单的方法可以“吞咽”所包含数组中的所有数字,并将它们明确地“序列化”到一个NumPy数组中,那么生成的数组将很容易比较。我主要感兴趣的是检查两个这样的数组是否相等(
=
np.allclose()
)。我曾经天真地尝试过这样做,在整个过程中抛出一个
np.array
,但这只会将最外层的列表转换为NumPy数组。

要使用
np.allclose
,您需要自己的比较函数

def compare(a, b):
    if isinstance(a, (list, tuple)) and isinstance(b, type(a)):
        for aa, bb in zip(a, b):
            if not compare(aa, bb):
                return False  # Short circuit
        return True
    else:  # numpy arrays
        return numpy.allclose(a, b)

当然,您可能会变得更加花哨(例如,将
kwargs
compare
向下传递到
allclose
),您的输入检查可能会更加稳健,但这应该会给您一个大致的想法……

这是一个小小的修改,以尝试过滤出a和b不属于同一类型的情况,也就是说,在我们试图检查的意义上是不可比较的:

def compare(a, b):
    if not isinstance(b, type(a)):
        raise TypeError('The two input objects must be of same type')
    else:
        if isinstance(a, (list, tuple)):
            for aa, bb in zip(a, b):
                if not compare(aa, bb):
                    return False  # Short circuit
            return True
        else:  # numpy arrays
            return np.allclose(a, b)

它总是一个大小为2的元组列表,第一个元素是数组,第二个元素是数组的元组?如果你想要
==
,你应该可以这样做:
a==b
,其中
a
b
是你描述的列表。如果你想要
np.allclose
,事情就会变得更困难。@Holt是的,总是元组结构,但事实上,列表可能包含更多的元组结构。@mgilson我可能想接受微小的数字差异-因此
allclose
。如果两个列表具有相同的数值,但不同的数组对象,该
==
产生一个
真值
错误<代码>=数组之间的测试可以生成布尔数组。
allclose
方法应该更安全。@hpaulj--derp。谢谢(你可以看出,我最近很少与
numpy
合作)。那我就把第一块去掉。聪明。我注意到,
和isinstance(b,type(a))
也确保了一个人实际上在检查同一类型的两个对象,并且由于这在某种程度上起到了输入验证的作用,所以有点遗憾的是,这也会在失败时触发
numpy.allclose
比较。我添加了你答案的一个变体,希望能解决这个问题。