Python NumPy-以矢量化方式测试等式,包括np.nan、np.nat、np.NZERO和np.PZERO

Python NumPy-以矢量化方式测试等式,包括np.nan、np.nat、np.NZERO和np.PZERO,python,numpy,equality,Python,Numpy,Equality,我基本上想用Numpy编写一个向量化函数,它将在元素方面比较二进制表示和所涉及数组的数据类型 比如说, f(np.nan,np.nan)应该是True f(np.datetime64('NaT'),np.nan)应该是False f(np.datetime64('NaT'),np.datetime64('NaT'))应该是True f(np.NZERO,np.PZERO)应为True在具有相同二进制表示形式的平台上,否则为False 任何其他奇怪的例外(?) 此外,该函数应该矢量化、快速(C

我基本上想用Numpy编写一个向量化函数,它将在元素方面比较二进制表示和所涉及数组的数据类型

比如说,

  • f(np.nan,np.nan)
    应该是
    True
  • f(np.datetime64('NaT'),np.nan)
    应该是
    False
  • f(np.datetime64('NaT'),np.datetime64('NaT'))
    应该是
    True
  • f(np.NZERO,np.PZERO)
    应为
    True
    在具有相同二进制表示形式的平台上,否则为
    False
  • 任何其他奇怪的例外(?)
此外,该函数应该矢量化、快速(C速度),并且至少“看起来”像一个
ufunc
,因为它应该支持通过阵列进行广播和串接

我已经试过了,但它不适用于
NaT
,等等:

下面需要熊猫,我不想这样做,它们将使
NaN==NaT

我可以将
np.isnat
添加到问题1中,但这无法比较对象的精度


所有这些都不能做NZERO/
PZERO
这件事。

似乎比较底层的
视图
正是我想要的:

def compare(x, y):
    x, y = np.broadcast_arrays(x, y)
    dtx = x.dtype
    dty = y.dtype
    if dtx != dty:
        return np.zeros(x.shape, dtype=bool)
    xv = x.view((np.uint8, x.itemsize))
    yv = y.view((np.uint8, y.itemsize))
    return np.all(xv == yv, axis=-1)

因此,它不是一个代码编写服务。向我们展示您所做的尝试,并就您遇到的单个问题提出具体问题。@PaulH我编辑此项以展示我在现有解决方案中遇到的问题。您是否知道存在多个NaN表示?大约有900亿。如果您正在比较两个不同的NAN,会发生什么情况?@user2357112我不知道,但感谢您提醒我。无论如何,就像我说的,我只想要二进制表示。
'uint8'
的拼写更好。
np.uint8
@Eric很好!不幸的是,我注意到这不适用于标量和0-d数组。如果您有更好的答案,请随时发布,我会接受。我已经修改了它以支持标量,并实现了您的建议,@Eric。您还可以使用
xv=x.view((np.uint8,x.itemsize))
,它适用于0d数组