在二维numpy数组中检查NaN

4
我正在处理一小段代码,它以我之前制作的插值表面为起点。插值填充了表面中的间隙,并用nan值代替。我的处理过程包括查看特定点周围的局部窗口,并使用局部表面计算一些度量。理想情况下,如果整个局部表面不包含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
我的代码中的“checking”函数没有发现数组中有一个nan。条件语句返回false而不是应该返回true来指示存在nan。我在检查数组方面是否遗漏了任何基本内容?或者我的方法完全错误?

1
我注意到sum上没有np。你可能正在使用内置的sum,它与numpy.sum的行为不同。 - user2357112
是的,我认为你想要使用 np.isnan(z).sum() - juanpa.arrivillaga
1
@juanpa.arrivillaga:np.isnan(z).any()可能更合适。 - user2357112
@user2357112 当然。 - juanpa.arrivillaga
1个回答

10

isnan()函数返回一个数组,其中的每个元素都是true或false。您需要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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接