8

I would like to get some advice on the most efficient way to return a list of unique values of a discrete-valued raster using Python and GDAL.

I had thought that the most obvious way would be to examine the raster's attribute table, but if I do band.GetDefaultRAT() on the band of a raster dataset that contains an attribute table (the table is visible in ArcCatalog, anyway), the result is always None:

>>> rat = band.GetDefaultRAT()
>>> rat == None
True

In that case, I end up having to scan through each cell of the raster and build a list of unique values manually. Is this the only way to do it?

Or is there a way to build an attribute table with Python and GDAL, then query it for a list of unique values?

  • Which version of GDAL are you using btw? – R.K. Sep 13 '12 at 7:29
  • stupid question but what is RAT? – nickves Sep 13 '12 at 9:28
  • RAT stands for Raster Attribute Table. – Markus M. May 3 '16 at 2:59
10

If I understood correctly, you can use np.unique function from numpy lib:

from osgeo import gdal
import numpy as np

ds = gdal.Open("myimg.ext")
band =  ds.GetRasterBand(1)
array = np.array(band.ReadAsArray())
values = np.unique(array)

or you can one-shot it:

values = np.unique(np.array(ds.GetRasterBand(1).ReadAsArray()))
  • Why wrap band.ReadAsArray() in a np.array call? Doesn't it already return a numpy array? – jpmc26 Jul 23 '18 at 18:08
  • 1
    Yes it does. Wrapping it in a np.array has no performance drawbacks, as it is not a copy but it uses the same memory address and helps your IDE identify the object so you'll have auto-completion enabled. – nickves Jul 25 '18 at 10:32

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.