结构化numpy数组的numpy.allclose相当于什么?

时间:2016-12-20 13:05:43

标签: numpy

在结构化数组上运行numpy.allclose(a, b)抛出TypeError: invalid type promotion。检查两个结构化数组的内容是否几乎相等的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

np.allclose执行np.isclose后跟all()isclose针对容差测试abs(x-y),并为np.nannp.inf提供住宿。因此它主要用于浮点数和扩展注释。

数组必须与np.isfinite(a)以及a-bnp.abs一起使用。简而言之,a.astype(float)应该适用于您的数组。

这些都不适用于结构化数组的复合dtype。您可以迭代数组的字段,并将其与isclose(或allclose)进行比较。但是您将确保2个数组具有匹配的dtypes,并对不适用于isclose的字段使用其他测试(例如字符串字段)。

所以在简单的情况下

all([np.allclose(a[name], b[name]) for name in a.dtype.names])

应该有用。

如果数组的字段都是相同的数字dtype,则可以将数组视为2d数组,并对这些数组执行allclose。但是,当字段是string,int和float的混合时,通常使用结构化数组。在最常见的情况下,dtypes中存在复合dtypes,需要进行某种递归测试。

import numpy.lib.recfunctions as rf

具有帮助复杂结构化数组操作的功能。

答案 1 :(得分:0)

假设b是标量,您可以遍历a的字段:

all(np.allclose(a[field], b) for field in a.dtype.names)