разделить на массивы, содержащие нули, 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 2

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') в конце функции.

Таким образом, вам не нужно беспокоиться о создании масок, чтобы избежать предупреждения.