我想使用两个数组进行计算,包含0到255之间的值。由于我不能除以零,我使用以下代码来避免这个问题。
#creation of the two arrays by reading pixel values of an image
data2 = band2.ReadAsArray(0,0,cols,rows)
data3 = band3.ReadAsArray(0,0,cols,rows)
#create array to mark all zero values
mask = numpy.greater((data2+data3), 0)
#do calculation with all values >0 or else assign them -99
ndvi = numpy.choose(mask,(-99, (data3-data2)/(data2 + data3)))
但是,我仍然收到错误:RuntimeWarning:在除法中遇到零除 我的错在哪里?它应该仍然想要除以零,是吗?
当我将最后一行更改为此时,它可以正常工作,但我的数据不再准确。
ndvi = numpy.choose(mask,(-99, (data3-data2)/(data2 + data3 + 1)))
答案 0 :(得分:1)
除以零的条件是(data2+data3)==0
,因此以下内容应该有效:
mask = numpy.not_equal((data2+data3), 0)
ndvi = numpy.choose(mask,(-99, (data3-data2)/(data2 + data3)))
另一种方法是:
mask = (data2+data3)==0
ndvi = np.zeros(data2.shape)
ndvi[ mask ] = -99
ndvi[ ~mask ] = ((data3-data2)/(data2+data3))[ ~mask ]
答案 1 :(得分:1)
如果你不关心得到除以零的“无穷大”,你可以使用代码顶部的numpy.seterr(zero='ignore')
来抑制numpy的警告。
或者,如果您只想将其用于特定部分(例如在函数中),请在函数顶部执行numpy.seterr(zero='ignore')
,然后在函数末尾执行numpy.seterr(zero='warn')
。
这样您就不必担心制作面具以避免警告。