gpt4 book ai didi

python - 具有灵活 dtype 的 NumPy 数组可以与 == 进行比较,但不能与 np.equal 进行比较

转载 作者:行者123 更新时间:2023-11-28 17:36:27 27 4
gpt4 key购买 nike

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

在我的例子中,一个解决方法是以不同的方式查看数组,因为我知道结构中的所有条目都是相同的数据类型,我可以执行以下操作:

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

我假设,通过使用给定输出,您的意思是等同于 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com