2013-03-13 3 views
4
>>> import numpy as np 
>>> x = np.eye(3) 
>>> x[1, 2] = .5 
>>> x 
array([[ 1. , 0. , 0. ], 
     [ 0. , 1. , 0.5], 
     [ 0. , 0. , 1. ]]) 
>>> 0 < x.any() < 1 
False 
>>> 

Я хотел бы проверить, если NumPy массив содержит любое значение между 0 и 1.
я прочитал 0 < x.any() < 1 как «если есть элемент с размером больше, то 0 и менее 1, обратный true ", но это, очевидно, не так.арифметические сравнения на Numpy массивов

Как я могу выполнить арифметическое сравнение по массиву numpy?

ответ

2
>>> np.any((0 < x) & (x < 1)) 
True 

x.any() Что на самом деле делает: это то же самое, как np.any(x), то есть он возвращает True, если какие-либо элементы в x не равны нулю. Итак, ваше сравнение 0 < True < 1, что неверно, потому что в python 2 0 < True это правда, но True < 1 нет, начиная с True == 1.

При таком подходе, наоборот, мы делаем логические массивы ли сравнение истинно для каждого элемента, а затем проверить, если какой-либо элемент этого массива верно:

>>> 0 < x 
array([[ True, False, False], 
     [False, True, True], 
     [False, False, True]], dtype=bool) 
>>> x < 1 
array([[False, True, True], 
     [ True, False, True], 
     [ True, True, False]], dtype=bool) 
>>> (0 < x) & (x < 1) 
array([[False, False, False], 
     [False, False, True], 
     [False, False, False]], dtype=bool) 

Вы должны сделать явным &, потому что, к сожалению, numpy не (и я думаю, не могу) работать с встроенной цепочкой операторов сравнения python.

+0

Я получаю 'ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте код a.any() или a.all() ', используя ваш код. – user2136786

+0

Да, извините, я изначально притворялся (всегда забывайте, что цепочка операторов не работает в numpy). Обновлено, с пояснениями. – Dougal

+1

Цепочка сравнения причин не работает (и не может) с массивами numpy, так это то, что python интерпретирует 'a shx2

1

Ваш код: первые тесты x.any(), что составляет True, так как x содержит ненулевое значение. Затем он тестирует 0 < True (=1) < 1, который составляет False. Do:

((0 < x) & (x < 1)).any() 
Смежные вопросы