es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Dividir dos arreglos numpy resultando exclusivamente en NaNs.

import rasterio
import numpy as np

path = '/Users/me/Desktop/'
filename = '*.tif'

with rasterio.open(path + filename) as src:
    band_red_radiance = src.read(3)

with rasterio.open(path + filename) as src:
    band_nir_radiance = src.read(4)

nir = np.array(band_red_radiance)
red = np.array(band_nir_radiance)

nir.dtype # uint16

np.seterr(divide='ignore', invalid='ignore')
ndvi = np.divide(np.subtract(red, nir), np.add(red, nir))

ndvi.max()
ndvi.min()

Puedo sumar y restar estas matrices sin problemas, pero no puedo dividirlas. Estoy utilizando los operadores propios de numpy para evitar problemas cuando los datos no son tipo float (son uint-16), pero incluso cuando los convierto a float, obtengo un mínimo y máximo de NaN.

import rasterio
import numpy as np

path = '/Users/me/Desktop/'
filename = '*.tif'

with rasterio.open(path + filename) as src:
    band_red_radiance = src.read(3)

with rasterio.open(path + filename) as src:
    band_nir_radiance = src.read(4)

nir = np.array(band_red_radiance)
red = np.array(band_nir_radiance)

nir.dtype # uint16

np.seterr(divide='ignore', invalid='ignore')
ndvi = np.divide(np.subtract(red, nir), np.add(red, nir))

ndvi.max()
ndvi.min()

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema en este código está en la operación de división en el cálculo de ndvi. Los valores de red y nir son ambos de tipo uint-16, lo que significa que cualquier valor mayor a 65535 no se representará adecuadamente. Por lo tanto, al restar red de nir, es posible obtener valores negativos que no se pueden representar como uint-16. De manera similar, al sumar red y nir, es posible obtener valores mayores a 65535. Dado que el cálculo de ndvi implica dividir estos valores, el resultado será NaN (no es un número) para cualquier valor que no se pueda representar adecuadamente como uint-16.

    Para solucionar este problema, los valores de red y nir deben ser convertidos a float antes de realizar cualquier cálculo. Esto evitará cualquier problema con valores negativos o fuera de rango. Aquí tienes una versión actualizada del código:

    import rasterio
    import numpy as np
    
    path = '/Users/me/Desktop/'
    filename = '*.tif'
    
    with rasterio.open(path + filename) as src:
        band_red_radiance = src.read(3)
    
    with rasterio.open(path + filename) as src:
        band_nir_radiance = src.read(4)
    
    nir = np.array(band_red_radiance, dtype=float)
    red = np.array(band_nir_radiance, dtype=float)
    
    ndvi = np.divide(np.subtract(red, nir), np.add(red, nir))
    
    print(ndvi.max())
    print(ndvi.min())
    

    Al convertir los valores de red y nir a float, la operación de división manejará adecuadamente cualquier valor fuera de rango, y el cálculo de ndvi debería producir resultados válidos.

Comments are closed.