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, но проблема не исчезнет.
Ответы
Ответ 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
.