我希望能够使用 np.equal 来查看两个结构化数组是否相等,以便我可以指定输出数组。然而,这行不通!但令我惊讶的是,使用 == 效果很好,并给出了预期的结果。还有一个怪癖是 np.equal 和 friend 返回一个 NotImplemented 对象(参见 https://github.com/numpy/numpy/issues/2091 )所以花了一段时间才找到这个错误......

import numpy as np
dt = np.dtype([('A', int), ('B', int)])
a = np.zeros(10, dtype=dt)
b = np.ones(10, dtype=dt)
print(np.equal(a, a)) # returns NotImplemented
print(np.equal(a, b)) # returns NotImplemented
print(a == a)         # returns array of 10 Trues
print(a == b)         # returns array of 10 Falses

在我的情况下,一种解决方法是以不同的方式查看数组,因为我知道结构中的所有条目都将是相同的 dtype,我可以执行以下操作:
A = a.view(a.dtype[0]).reshape(-1, len(a.dtype))
B = b.view(b.dtype[0]).reshape(-1, len(b.dtype))
np.equal(A, B).all(axis=1)

但是,这给我带来了一些问题,因为我只能真正有效地从 all 而不是 equal 预分配输出数组,因此它不是最佳的。另外,我只是想了解 equal== 有什么不同,我真的以为它们是一样的......

万一重要,我正在运行:
Python:2.7.9(默认,2014 年 12 月 10 日,12:24:55)[MSC v.1500 32 位(英特尔)]
NumPy:1.8.2

最佳答案

a == b 转换为 a.__eq__(b)

In [377]: a.__eq__??
Type:        method-wrapper
String form: <method-wrapper '__eq__' of numpy.ndarray object at 0xa2095d8>
Definition:  a.__eq__(self, *args, **kwargs)
Docstring:   Return self==value.
np.equal 是一个 ufunc ( equal(x1, x2[, out]) )

两者都是用 C 实现的,因此需要进行一些挖掘才能了解它们的不同之处。

由于它们显然是独立实现的,因此任何数量的实现细节都可能产生差异。

例如,一个可能将元素向下比较到 np.void 级别,另一个可以向下比较到 tuple 级别。
In [404]: np.equal(a[1],b[1])
Out[404]: NotImplemented

In [405]: a[1].item()==b[1].item()
Out[405]: False

我假设,通过 working with given output ,您的意思相当于 ufunc out 参数。

我想知道以下是否可以解决问题:
c = np.empty((10,), dtype=bool)
c[:] = a==b    # or c[...]=
c[:] = a==a

我不能保证这不会涉及临时数组。但是各种采用 out 并完全用 Python 编码的函数都使用这种方法。

关于python - 具有灵活 dtype 的 NumPy 数组可以与 == 进行比较,但不能与 np.equal 进行比较,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29980774/

10-16 03:12