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

Python numpy.all与对象数据类型的奇怪行为,python,numpy,Python,Numpy,给定一个dtype=object数组,numpy.all/any返回最后一个对象。例如: >>> from string import ascii_lowercase >>> x = np.array(list(ascii_lowercase), dtype=object) >>> x.all() 'z' 在研究这个问题的过程中,我找不到太多东西,但这让我发现这是numpy中的一个公开bug(截至2015年3月):而且。发布这些信息,以便其

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

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

在研究这个问题的过程中,我找不到太多东西,但这让我发现这是numpy中的一个公开bug(截至2015年3月):而且。发布这些信息,以便其他人能够更有效地找到这些信息

numpy
版本
1.8.2
np.任何
np.所有
都表现为典型的短路逻辑和/或功能。我想起了LISP behavor。Python的
操作符可以实现这一点

一些例子:

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。任何逻辑上为真的第一项;除此之外,还有最后一项

在LISP世界中,这被视为一个有用的特性。它不仅在结果明确后立即停止计算元素,而且还可以使用返回值的标识

是否有一种方法可以使用
和/或
操作符以及某种映射或缩减来复制此行为

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、b:b和a
返回列表中的第一项,而不是最后一项。计时可用于测试它是否在整个阵列中循环(或不循环)


np.all
是一个
ufunc
,定义为
np.logical\u和.reduce

数据类型=对象的
logical_和
c
源中定义

同样适用于
np.any
。数字数据类型版本在其他位置定义

有一个补丁强制
np.all/any
返回
dtype=bool
。但是通过直接调用
np.logical\u 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

所以,这不是一个真正的问题,是吗?知道这一点很有用,但我不认为应该在哪里发布。哪里是更好的发布位置?我们是否应该投票以上述SO帖子的副本形式关闭?我认为使用
lambda x,y:x和y
进行减少将有助于实现
所有
,否?
/* Emulates Python's 'a and b' behavior */
static PyObject *
npy_ObjectLogicalAnd(PyObject *i1, PyObject *i2)
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