X

NV5 Geospatial Blog

Each month, NV5 Geospatial posts new blog content across a variety of categories. Browse our latest posts below to learn about important geospatial information or use the search bar to find a specific topic or author. Stay informed of the latest blog posts, events, and technologies by joining our email list!



14674 Rate this article:
3.2

IDL's HISTOGRAM function

Anonym

IDL's HISTOGRAM function

IDL's HISTOGRAM function is one of the most versatile functionsI can think of. It can be very fast and efficient for a number of common tasks.

1. Plotting a histogram is an effective way to investigate statisticalproperties of data. A probability density graph quickly shows the distribution:

IDL> a = randomn(seed, 100000)+15.5+3*randomn(seed, 100000)

IDL> p = plot(location,histogram(a,nbins=1000,location=location),'r')

histogram plot

From the histogram, you could quickly conclude that asuitable range for BYTSCL might be MIN=10.0, MAX=20.0.

2. Finding percentiles in a programmatic way can be doneusing lookups in the cumulative histogram, for example if you want to find the5% and 95% in a dataset:

IDL> a = randomn(seed, 100000)+15.5+3*randomn(seed, 100000)

IDL> location[value_locate(total(histogram(a,nbins=1000,location=location),/cumulative)/a.length,[0.05,0.95])]

      10.285119       20.638901

Which shows that about 90% of the values are between 10.29and 20.64.

3. Finding the most common number in an array of integers.

IDL> arr = [3,7,34,5,8,8,5,31,5,8]

IDL> location[where(histogram(arr) eq max(histogram(arr,location=location)))]

       5       8

This shows a tie between 5 and 8 for the most abundant valuein the array.

4. Sorting can also be performed with HISTOGRAM. For example2-D sorting into a grid and computing the mean "F" value for eachgrid tile:

IDL> x = 45*randomu(seed, 100000)

IDL> y = 32*randomu(seed, 100000)

IDL> f = 5.5*randomn(seed, 100000) + 16

IDL> grid_index = floor(x + floor(y)*ceil(max(x)))

IDL> h = histogram(grid_index, min=0, binsize=1,reverse_indices=rev)

IDL> f_means = dblarr(ceil([max(x),max(y)]))

IDL> for i=0,h.length-1 do if h[i] gt 0 then f_means[i] = mean(f[rev[rev[i]:rev[i+1]-1]])

Check one of the values using the slower "WHERE"approach:

IDL> f_means[6,8]

      15.784905433654785

IDL> mean(f[where(floor(x) eq 6 and floor(y) eq 8)])

       15.784905

Please login or register to post comments.
«April 2025»
SunMonTueWedThuFriSat
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910
Digital Number, Radiance, and...

Number of views (168799)

Push Broom and Whisk Broom Sensors

Number of views (149863)

The Many Band Combinations of Landsat 8

Number of views (118017)

What Type of Loop Should I Use?

Number of views (78282)

Mapping Coastal Erosion Using LiDAR

Number of views (58291)