Prueba esto:
- Utilice la RasterToNumpyArray función para convertir tu raster multibanda en un array n-dimensional con dimensiones (# de bandas, filas,columnas)
- Utilice la no_igual del módulo numpy para realizar una comparación celda a celda de cada banda.
- Utilice la único del módulo numpy y comprensiones de listas para encontrar el número total de celdas que han cambiado/no han cambiado.
Ejemplo...
Utilizando simples rásters de 3 bandas (species_n y species_f), el código de ejemplo siguiente
import arcpy
import numpy as np
sn = arcpy.RasterToNumPyArray(r'D:\species.gdb\species_n',nodata_to_value = -999.999) #species now
print "\nSpecies Now"
print "Data Type: {0}".format(sn.dtype)
print "Bands, Rows, Columns: {0}\n".format(sn.shape)
sf = arcpy.RasterToNumPyArray(r'D:\species.gdb\species_f',nodata_to_value = -999.999) #species future
print "\nSpecies Future"
print "Data Type: {0}".format(sn.dtype)
print "Bands, Rows, Columns: {0}\n".format(sn.shape)
#Band comparison
#cell by cell comparison - returns true if cell values not equal, else false.
band_comparison = np.not_equal(sn[0],sf[0])
u, indices = np.unique(band_comparison, return_inverse = True)
#Count #number of changed cells
#this step can be replaced with a far more elegant approach
cell_counts = zip(u,[u[indices].tolist().count(x) for x in u])
print "\nChanged Cells:\n{0}".format(cell_counts)
produce los resultados que se muestran a continuación:
Nota: en este ejemplo, la banda 1 de species_n es exactamente la misma que la banda_1 de species_f. Los resultados anteriores muestran que no hay celdas modificadas, como era de esperar.
las especies_f(bandas 2 y 3) son múltiplos de las especies_n(bandas 2 y 3)
Comparación de la banda 2:
band_comparison = np.not_equal(sn[1],sf[1])
produce:
10 celdas no han cambiado (en este ejemplo, se trata simplemente de celdas sin datos) 26 celdas han cambiado.