разделить на массивы, содержащие нули, python
Я хочу произвести расчет с использованием двух массивов, содержащих значения от 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: divide by zero, встречающуюся в divide где же моя ошибка? Он не должен все еще хотеть делить на ноль, не так ли?
Когда я меняю последнюю строку на эту, она работает, но мои данные больше не точны.
ndvi = numpy.choose(mask,(-99, (data3-data2)/(data2 + data3 + 1)))
2 ответа:
Ваше условие деления на ноль -
(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 ]
Если вы не заботитесь о получении "Бесконечности", где вы делите на ноль, вы можете подавить предупреждение numpy, используя
numpy.seterr(zero='ignore')
в верхней части вашего кода.Или, если вы хотите использовать его только для определенного раздела (скажем, в функции), сделайте
numpy.seterr(zero='ignore')
в верхней части функции, а затемnumpy.seterr(zero='warn')
в конце функции.Таким образом, вам не нужно беспокоиться о создании масок, чтобы избежать предупреждения.