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?

asked Sep 13, 2012 at 6:52
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()))
answered Sep 13, 2012 at 9:37
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

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.