NumPy - 以矢量化方式测试相等性,包括 np.nan、np.nat、np.NZERO 和 np.PZERO
NumPy - Testing equality including np.nan, np.nat, np.NZERO and np.PZERO in a vectorized way
我基本上想在 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 速度)并且至少 "look like" 一个 ufunc
,因为它应该支持数组上的广播和串接。
我已经试过了,但它不适用于 NaT
,等等:Comparing NumPy arrays so that NaNs compare equal
以下要求 Pandas,我不想这样做,他们会要求 NaN == NaT
。
我可以将 np.isnat
添加到问题 1,但这不会比较对象的精度。
其中 none 可以完成 NZERO
/PZERO
的事情。
比较底层 view
似乎完全符合我的要求:
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)
我基本上想在 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 速度)并且至少 "look like" 一个 ufunc
,因为它应该支持数组上的广播和串接。
我已经试过了,但它不适用于 NaT
,等等:Comparing NumPy arrays so that NaNs compare equal
以下要求 Pandas,我不想这样做,他们会要求 NaN == NaT
。
我可以将 np.isnat
添加到问题 1,但这不会比较对象的精度。
其中 none 可以完成 NZERO
/PZERO
的事情。
比较底层 view
似乎完全符合我的要求:
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)