Почему «Нет в numpy.asarray (…)» вызывает будущее предупреждение

Будущее предупреждение происходит, когда вы делаете что-то вроде этого:

>>> numpy.asarray([1,2,3,None]) == None 

Который в настоящее время возвращает False , но я понимаю, что вернет массив, содержащий [False,False,False,True] в будущей версии Numpy.

Как обсуждалось в списке обсуждений numpy, путь вокруг этого теста a is None .

Меня смущает такое поведение ключевого слова in с 1D-массивом по сравнению со списком:

 >>> None in [1,2,3,None] True >>> None in numpy.asarray([1,2,3,None]) __main__:1: FutureWarning: comparison to 'None' will result in an elementwise object comparison in the future False >>> 1 in numpy.asarray([1,2,3,None]) True 

EDIT (см. Комментарии). На самом деле есть два разных вопроса:

  1. Почему это вызывает FutureWarning – как будет сравниваться будущее поведение None in numpy.asarray(...) с тем, что оно сейчас?
  2. Почему разница в поведении in из list ; могу ли я проверить, содержит ли мой массив None не преобразовывая его в список или используя цикл for ?

Версия для ПК – 1.9.1, Python 3.4.1

One Solution collect form web for “Почему «Нет в numpy.asarray (…)» вызывает будущее предупреждение”

Будущее предупреждение происходит, когда вы делаете что-то вроде этого:

 numpy.asarray([1,2,3,4]) == None 

Который в настоящее время возвращает False , но я понимаю, что вернет массив, содержащий [False,False,False,True] в будущей версии Numpy.

Как я уже упоминал в комментариях, ваш пример неверен. Будущие версии numpy вернут [False ,False, False, False] , то есть False для каждого элемента массива, который не равен None . Это в большей степени согласуется с тем, как в настоящее время работают сопоставления элементов с другими скалярными значениями, например:

 In [1]: np.array([1, 2, 3, 4]) == 1 Out[1]: array([ True, False, False, False], dtype=bool) In [2]: np.array(['a', 'b', 'c', 'd']) == 'b' Out[2]: array([False, True, False, False], dtype=bool) 

Меня смущает такое поведение ключевого слова in с 1D-массивом по сравнению со списком

Когда вы проверяете x in y , вы вызываете y.__contains__(x) . Когда y является списком, __contains__ основном что-то делает в соответствии с этим:

 for item in y: if (item is x) or (item == x): return True return False 

Насколько я могу судить, np.ndarray.__contains__(x) выполняет эквивалент этого:

 if any(y == x): return True else: return False 

То есть он сначала проверяет элементарное равенство по всему массиву ( y == x будет булевым массивом размером y ). Поскольку в вашем случае вы проверяете, будет ли y == None , это повысит FutureWarning по причинам, указанным выше.

В комментариях вы также хотели знать, почему

 np.nan in np.array([1, 2, 3, np.nan]) 

возвращает False , но

 np.nan in [1, 2, 3, np.nan] 

возвращает значение True . Первая часть легко объясняется тем фактом, что np.nan != np.nan ( см. Здесь объяснение ). Чтобы понять, почему второй случай возвращает значение True , помните, что этот list.__contains__() сначала проверяет идентификатор ( is ) перед проверкой равенства ( == ). Поскольку np.nan is np.nan , второй случай вернет True .

  • Есть ли более векторный способ выполнения numpy.outer вдоль оси?
  • Как установить точность на str (numpy.float64)?
  • Поверхностная кривизна Matlab эквивалент в Python
  • Как расширить массив на месте в Numpy?
  • Как добраться до единичной матрицы от numpy.dot (A, A_inv)
  • Быстрый поиск пиков и центрирование в python
  • Преобразуйте и введите список в массив numpy
  • Каковы наиболее надежные и интерактивные способы структурирования общих наборов данных 2D / 3D / ND в Python?
  •  
    Interesting Posts for Van-Lav

    Как увеличить с Axes3D в Matplotlib

    Tuple Unpacking Подобно Python, но в Common Lisp

    Создание настраиваемого категорированного корпуса в NLTK и Python

    Входы LSTM для Tensorflow

    2 раковины 1 стакан. Совместное использование очереди между двумя скриптами Python на малине Pi

    Изменение размера и преобразования изображения Django перед загрузкой

    Почему struct.pack обладает такой высокой изменчивостью в производительности?

    Замените определенное слово, учитывая его положение в текстовом файле (Python)

    virtualenv не находит обновленный модуль

    Почему Python 3 разрешает «00» как литерал для 0, но не позволяет «01» как литерал для 1?

    Python … классы тестирования?

    пробуя все комбинации операций над списком переменных

    Множественное умножение матрицы

    Отображать массив NumPy как постоянное обновление изображения с помощью Glumpy

    Python Sockets использует функцию вместо глобального вызова сокета

    Python - лучший язык программирования в мире.