python - numpy.all 与对象数据类型的奇怪行为

标签 python numpy

给定一个 dtype=object 数组,numpy.all/any 返回最后一个对象。例如:

>>> from string import ascii_lowercase
>>> x = np.array(list(ascii_lowercase), dtype=object)
>>> x.all()
'z'

在研究这个问题时,除了this seemingly unrelated SO post之外我找不到太多东西。这让我发现这是 numpy 中的一个 Unresolved 错误(截至 2015 年 3 月):first reportmore relevant issue 。发布此信息,以便其他解决此问题的人可以更有效地找到此信息。

最佳答案

numpy 版本 1.8.2 中,np.anynp.all 表现为经典短路逻辑和/或功能。我想到了 LISP 行为。 Python 的 andor 运算符可以执行此操作。

一些例子:

In [203]: np.all(np.array([[1,2],1,[],[1,2,3]],dtype=object))
Out[203]: []

In [204]: np.any(np.array([[1,2],1,[],[1,2,3]],dtype=object))
Out[204]: [1, 2]

In [205]: np.any(np.array([0,[],[1,2],1,[],[1,2,3]],dtype=object))
Out[205]: [1, 2]

In [206]: np.all(np.array([True,False,[1,2],1,[],[1,2,3]],dtype=object))
Out[206]: False

np.all 返回第一个逻辑上为 False 的项目;否则是最后一项。 np.any 第一个逻辑上为 True 的项目;否则是最后一项。

在 LISP 世界中,这被认为是一个有用的功能。一旦结果明确,它不仅会停止计算元素,而且可以使用该返回值的标识。

有没有办法使用和/或运算符以及某种map或reduce来复制此行为?

In [8]: 0 or [] or [1,2] or 1 or [1,2,3]
Out[8]: [1, 2]

???([0,[],[1,2],1,[1,2,3]])
<小时/>

按照评论中的建议:

In [26]: reduce(lambda a,b:a and b, np.array([1,2,3,[1,2,3]],dtype=object))
Out[26]: [1, 2, 3]

这实际上可能不会使整个循环短路。相反,它会短路每个步骤,并向前传播该值。使用 lambda a,b:b 和 a 会返回列表中的第一项,而不是最后一项。计时可用于测试它是否循环遍历整个数组(或没有)。

<小时/>

np.all 是一个 ufunc,定义为 np.logic_and.reduce

https://github.com/numpy/numpy/blob/master/numpy/core/_methods.py

umr_all = um.logical_and.reduce
def _all(a, axis=None, dtype=None, out=None, keepdims=False):
    return umr_all(a, axis, dtype, out, keepdims)
dtype=object 的

tical_andc 源代码中定义

https://github.com/numpy/numpy/blob/master/numpy/core/src/umath/funcs.inc.src

/* Emulates Python's 'a and b' behavior */
static PyObject *
npy_ObjectLogicalAnd(PyObject *i1, PyObject *i2)

np.any类似。数字数据类型版本在其他地方定义。

有一个补丁可以强制 np.all/any 返回 dtype=bool。但通过直接调用np.ological_all,您可以自己控制。

In [304]: np.logical_or.reduce(np.array([0,[1,2,3],4],dtype=object))
Out[304]: [1, 2, 3]

In [305]: np.logical_or.reduce(np.array([0,[1,2,3],4],dtype=object),dtype=bool)
Out[305]: True

关于python - numpy.all 与对象数据类型的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31321652/

相关文章:

python - matplotlib 的平滑、插值的三级或四级色标(例如 r、g、b 三角形)?

python - 无法在 Google Cloud SQL 上插入数据,但 UID 字段仍在自动递增

python - 如何在找到值后立即在字符串搜索中跳到索引? Python

python - 即使使用种子值,tensorflow tf.data.experimental.rejection_resample 也无法实现目标分布

python-3.x - 在 numpy 中获取索引

python - 计算FFT频率分量的功率

python - 为什么接近于零的除法在 python 中有不同的行为?

python - Python tkinter Entry 小部件的无值

python - Tensorflow 阅读 CSV - 什么是最好的方法

python - numpy函数.fft.fft2()给出错误: “cannot do a non-empty take from an empty axis”(opencv,matplotlib,numpy,python27)