gpt4 book ai didi

python - 为什么numpy中没有 'is' ufunc?

转载 作者:行者123 更新时间:2023-12-02 01:53:59 26 4
gpt4 key购买 nike

我当然可以

a[a == 0] = something

a 中每个等于 0 的条目设置为 something。同样,我可以写

a[np.equal(a, 0)] = something

现在,想象 adtype=object 的数组。我不能写 a[a is None] 因为,当然,a 本身不是 None。意图很明确:我希望比较 is 像任何其他 ufunc 一样被广播。这个list from the docs没有列出任何类似于 is-unfunc 的内容。

为什么没有,而且,对我来说更有趣的是:什么是高性能替代品?

最佳答案

这里有两件事在起作用。

第一个(也是更重要的)是 is 是直接在 Python 解释器中实现的,没有重定向到 dunder 方法的选项。 Numpy 数组与许多其他对象一样,有一个实现 == 操作的 __eq__ 方法。 a is None 大约被视为 id(a) == id(None),在任何情况下都无法追索元素实现。这就是 python 的工作原理。

第二个方面是 numpy 本质上是为存储数字而设计的。对象数组是将对象的引用存储为数字的特殊情况。这看起来与列表存储对象引用的方式相同,但仅在处理引用时才相似。例如,列表的元素始终是对对象的引用,即使列表包含同构整数也是如此。 dtype int 的 numpy 数组包含 python 对象。数组的每个连续元素都是原始二进制整数,而不是对 python 对象包装器的引用。即使Python允许你重写is运算符,按元素应用也是没有意义的。

因此,如果你想比较对象,请使用 python 列表:

mylist = [...]
mylist = [something if x is None else x for x in mylist]

如果您坚持使用 numpy 数组,则 (a) 使用数值数组并用其他内容标记 None 元素,例如 np.nan,或者 (b)将数组视为列表。您必须将 idis 应用于每个元素,它们是 python 构造,因此此时没有“高性能”方法来执行此操作,或者 (c)只需使用==,它将触发python级别的相等比较,这相当于单例Noneis

关于python - 为什么numpy中没有 'is' ufunc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69838877/

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