大数组之间的numpy boolean比较返回False而不是boolean数组

Fab*_*nna 10 python arrays numpy

我刚遇到以下问题.从两个数组开始,执行布尔比较,如:

In [47]: a1 = np.random.randint(0,10,size=1000000)

In [48]: a2 = np.random.randint(0,10,size=1000000)

In [52]: a1[:,None] == a2
Out[52]: False
Run Code Online (Sandbox Code Playgroud)

返回布尔值而不是布尔数组,而:

In [62]: a1 = np.random.randint(0,10,size=10000)

In [63]: a2 = np.random.randint(0,10,size=10000)

In [64]: a1[:,None] == a2
Out[64]: 
array([[False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       ..., 
       [False, False, False, ..., False, False, False],
       [ True, False, False, ..., False, False, False],
       [False, False, False, ...,  True, False, False]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

按预期工作.这是与阵列大小有关的问题吗?无论大小如何,对阵列的单个维度执行简单比较都可以.

In [65]: a1 = np.random.randint(0,10,size=1000000)

In [66]: a2 = np.random.randint(0,10,size=1000000)

In [67]: a1 == a2
Out[67]: array([False, False, False, ..., False, False,  True], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

任何人都能重现这个问题?我在Numpy 1.9.2和Python 2.7.3上.

编辑:只是更新到Numpy 1.11但问题仍然存在.

Ale*_*ley 8

当我尝试比较时,我收到一个警告:

[...]/__main__.py:1: DeprecationWarning: elementwise == comparison failed;
this will raise an error in the future.
    if __name__ == '__main__':
Run Code Online (Sandbox Code Playgroud)

此警告被触发NumPy的代码在这里:

if (result == NULL) {
    /*
     * Comparisons should raise errors when element-wise comparison
     * is not possible.
     */
    /* 2015-05-14, 1.10 */
    PyErr_Clear();
    if (DEPRECATE("elementwise == comparison failed; "
                  "this will raise an error in the future.") < 0) {
        return NULL;
    }
Run Code Online (Sandbox Code Playgroud)

到达此分支是因为result == NULL,result当NumPy 尝试执行请求的操作时发生的情况(元素相等性检查,涉及广播两个数组).

为什么这个操作失败并返回NULL?很可能是因为NumPy的需要分配一个巨大的存储器用于阵列块; 足以容纳10 12个布尔人.这大约是931 GB:它无法执行此操作NULL而是返回.