Подтвердить что ты не робот

Numpy boolean сравнение больших массивов возвращает False вместо логического массива

Я только что столкнулся со следующими проблемами. Начиная с двух массивов и выполняя логическое сравнение, например:

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

возвращает логическое значение вместо массива логических значений, тогда как:

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)

работает как ожидалось. Это вопрос, связанный с размерами массивов? Выполнение простого сравнения по одиночному размеру массива работает независимо от размера.

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)

Кто-нибудь может воспроизвести проблему? Я нахожусь на Numpy 1.9.2 и Python 2.7.3.

EDIT: просто обновите Numpy 1.11, но проблема не исчезнет.

4b9b3361

Ответ 1

Когда я пытаюсь провести сравнение, я получаю предупреждение:

[...]/__main__.py:1: DeprecationWarning: elementwise == comparison failed;
this will raise an error in the future.
    if __name__ == '__main__':

Это предупреждение запускается в коде 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;
    }

Эта ветка достигнута, потому что result == NULL, где result это то, что произошло, когда NumPy попытался выполнить запрошенную операцию (элементарная проверка равенства, включающая широковещание двух массивов).

Почему эта операция завершилась с ошибкой и вернула NULL? Очень возможно потому, что NumPy нужно было выделить огромный массив памяти для массива; достаточно, чтобы удержать 10 12 булевых. Это около 931 ГБ: он не мог этого сделать и вместо этого возвращал NULL.