简体   繁体   English

检查np.nan是否在数组内返回非预期值

[英]Checking if np.nan is inside an array returns non expected values

Why an array element arr[i][j] when equal to nan , is not being validated as np.nan? 为什么当数组元素arr[i][j]等于nan ,没有被验证为np.nan?

I have ran some tests with the variable and was not able to found why that is hapenning. 我已经对该变量进行了一些测试,但无法找到原因。

In : nval
Out: array([  0.,  nan])

In : type(nval)
Out: numpy.ndarray

In : type(nval[0])
Out: numpy.float64

In : type(nval[1])
Out: numpy.float64

In : arr[15][4] 
Out: nan

In : type(arr[15][4])
Out: numpy.float64
# Expected True
In : arr[15][4] == np.nan
Out: False

# Expected True
In:  nval[1] == np.nan
Out: False

# Expected True    
In:  arr[15][4] == nval[1]
Out: False

# Expected True
In:  arr[15][4] in nval
Out: False

In:  0 in nval
Out: True

# Expected True    
In:  np.nan in nval
Out: False

I think all are failing by the same reason, just can't figure out where. 我认为所有人都因为相同的原因而失败,只是不知道在哪里。

Code: 码:

import numpy as np
import numpy.ma as ma
import matplotlib.pyplot as plt

def spill(arr, nval=[0,np.nan], metric=1):
    m=metric
    narr=np.copy(arr)
    nval=np.asarray(nval)
    for i in range(arr.shape[0]):
        for j in range(arr.shape[1]):
            if arr[i][j] not in nval:
                # This helps to check what is happening
                # print "{0},{1}: {2}".format(i,j,arr[i][j])
                # print narr[i-m:i+m+1:1,j-m:j+m+1:1]
                narr[i-m:i+m+1:1,j-m:j+m+1:1]=arr[i][j]                    
    return narr


msize=50
rrange=10
jump=10
start=5
dpi=96
h=500
w=500

X,Y=np.meshgrid(range(0,msize),range(0,msize))
dat=np.random.rand(msize,msize)*rrange


msk=np.zeros_like(dat)
msk[start::jump,start::jump].fill(1)
mdat=msk*dat
mdat[mdat==0]=np.nan

# If I run spill over the `mdat` before the np.nan, all works fine
# as expected by the tests above. But I wish to be able to check
# also against `np.nan`.
sdat = spill(mdat)

mmdat = ma.masked_where(np.isnan(mdat),mdat)
smdat = ma.masked_where(np.isnan(sdat),sdat)

print mmdat[5]
# I expected similar output except smdat[5][4] and smdat[5][6] should
# be equal to smdat[5][5].
print smdat[5]

根据文档尝试使用np.isnan

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM