我希望能够使用 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/