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
比较。我添加了你答案的一个变体,希望能解决这个问题。