在结构化数组上运行numpy.allclose(a, b)
抛出TypeError: invalid type promotion
。检查两个结构化数组的内容是否几乎相等的正确方法是什么?
答案 0 :(得分:2)
np.allclose
执行np.isclose
后跟all()
。 isclose
针对容差测试abs(x-y)
,并为np.nan
和np.inf
提供住宿。因此它主要用于浮点数和扩展注释。
数组必须与np.isfinite(a)
以及a-b
和np.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)