[英]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.