除以包含零的数组,python

时间:2013-07-07 17:18:23

标签: python arrays numpy zero divide

我想使用两个数组进行计算,包含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)))

2 个答案:

答案 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')

这样您就不必担心制作面具以避免警告。