проверка nan в массивах 2d numpy

Я работаю над небольшим фрагментом кода, который начинается с интерполированной поверхности, которую я сделал ранее. Интерполяция заполнила пробелы на поверхности нанами. Часть моей обработки включает просмотр локального окна вокруг определенной точки и вычисление некоторых измерений с использованием локальной поверхности. В идеале я хотел бы, чтобы этот код только мог выполнять какие-либо вычисления, если вся локальная поверхность не содержит значений nan. Код перебирает исходную большую поверхность и проверяет, есть ли в локальном окне о точке значение nan.

Я знаю, что это не самый эффективный способ сделать это, мне не нужно беспокоиться об эффективности времени.

Вот что у меня есть до сих пор:

for in in range(startz,endx):
    imin = i - half_tile
    imax = i + half_tile +1   

    for j in range(starty,endy):
        jmin = i - half_tile
        jmax = i + half_tile +1 

        #Test the local surface for nan's
        z = surface[imin:imax,jmin:jmax]
        Test = np.isnan(sum(z))

        #conditional statement
        if Test:
            print 'We have a nan'
            #set measures I want to calculate to zero

        else:
            print 'We  have a complete window'
            #do a set of calculations

переменная surface — это интерполированная поверхность, которую я создал изначально. Переменные half_tile просто определяют размер локального окна, которое я хочу использовать. startx,endx,starty,endy определяют размер исходной поверхности для повторения.

Где я сталкиваюсь с проблемами, так это в том, что мой условный оператор, похоже, не работает. Он скажет мне, что локальное окно, которое я оцениваю, не содержит nan, но тогда остальная часть моего кода (который я здесь не показывал) не будет работать, потому что он говорит, что в массиве есть nan.

Примером этого может быть:

 [[ 7.07494104  7.04592032  7.01689961  6.98787889  6.95885817  6.92983745
  6.90081674  6.87179602  6.8427753   6.81375458  6.78473387  6.75571315
  6.72669243]
 [ 7.10077447  7.07175376  7.04273304  7.01371232  6.98469161  6.95567089
 6.92665017  6.89762945  6.86860874  6.83958802  6.8105673   6.78154658
 6.75252587]
 [ 7.12660791  7.09758719  7.06856647  7.03954576  7.01052504  6.98150432
 6.9524836   6.92346289  6.89444217  6.86542145  6.83640073  6.80738002
  6.7783593 ]
  [ 7.15244134  7.12342063  7.09439991  7.06537919  7.03635847  7.00733776
 6.97831704  6.94929632  6.9202148   6.89105825  6.86190169  6.83274514
 6.80358859]
 [ 7.17804068  7.14888413  7.11972758  7.09057103  7.06141448  7.03225793
  7.00310137  6.97394482  6.94478827  6.91563172  6.88647517  6.85731862
      nan]]

Вот пример локального окна, которое оценивает мой код. В моем коде это будет z. Весь массив имеет хорошие значения, за исключением последнего значения, которое является nan.

Функция «проверки» в моем коде не улавливает, что в массиве есть nan. Условный оператор возвращает false, когда он должен быть true, чтобы указать, что присутствует nan. Мне не хватает чего-то фундаментального в том, как я проверяю массив? или мои методы совершенно неверны?


person Andrew Dennison    schedule 22.03.2017    source источник
comment
Я заметил, что на sum нет np. Возможно, вы используете встроенный sum, который ведет себя иначе, чем numpy.sum.   -  person user2357112 supports Monica    schedule 22.03.2017
comment
Да, думаю, ты хочешь np.isnan(z).sum()   -  person juanpa.arrivillaga    schedule 23.03.2017
comment
@juanpa.arrivillaga: np.isnan(z).any(), вероятно, было бы более подходящим.   -  person user2357112 supports Monica    schedule 23.03.2017
comment
@ user2357112 Конечно.   -  person juanpa.arrivillaga    schedule 23.03.2017


Ответы (1)


isnan() возвращает массив с истинным или ложным значением для каждого элемента в массиве. вам нужно np.any() в дополнение к isnan(). см. пример ниже

import numpy as np
a = np.array([[1,2,3,4],[1,2,3,np.NaN]])
print np.isnan(a)
print np.any(np.isnan(a))

приводит к

[[False False False False]
 [False False False  True]]
True
person plasmon360    schedule 22.03.2017