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?

3
  • Which version of GDAL are you using btw? Commented Sep 13, 2012 at 7:29
  • stupid question but what is RAT? Commented Sep 13, 2012 at 9:28
  • RAT stands for Raster Attribute Table. Commented May 3, 2016 at 2:59

1 Answer 1

11

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())) 
2
  • Why wrap band.ReadAsArray() in a np.array call? Doesn't it already return a numpy array? Commented Jul 23, 2018 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. Commented Jul 25, 2018 at 10:32

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.