Aspect values to categories
When dealing with terrain aspect values, you might find yourself needing to categorize them into sectors e.g. 10 deg N = North, 24 deg North = North-east, 90 deg North = East etc. This is also something to consider when using such data in a machine learning workflow too as you may find you need to encode the categories rather than use the raw aspect orientations (rescaling aspect orientations between 0 and 1 doesn’t make sense….)
Below is a helper function that does the aspect category mapping for you. You just need to pass it an input array such as a pandas series.
import pandas as pd
import numpy as np
def categorize_aspect(aspect_array, check_output=True):
"""Recategorizes numerical aspect values to quadrants (N/NE/E etc.)
Takes in an e.g. pandas data frame series (expected to be 1D)
e.g. categorize_aspect(dataframe['your_column'])
North: 0° – 22.5°
Northeast: 22.5° – 67.5°
East: 67.5° – 112.5°
Southeast: 112.5° – 157.5°
South: 157.5° – 202.5°
Southwest: 202.5° – 247.5°
West: 247.5° – 292.5°
Northwest: 292.5° – 337.5°
North: 337.5° – 360°
Returns: numpy ndarray
"""
bins = [0, 22.5, 67.5, 112.5, 157.5, 202.5,
247.5, 292.5, 337.5, 360]
names = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW', 'N2']
# we'll have 2 N quadrants so use N2 for the second as they have to be unique
aspect_cat = pd.cut(aspect_array, bins, labels=names)
aspect_cat[aspect_cat=='N2']='N' # merge N2 cats with N
# Check values have mapped correctly - prints to standard output
if check_output:
random_indxs=np.random.randint(low=1, high=aspect_cat.shape[0], size=20) #random values within shape of series
before=aspect_array[random_indxs]
after=aspect_cat[random_indxs]
print("Aspect (deg N) | Aspect quadrant")
for i in range(0,len(before)):
print("%0.2f | %s" %(before.iloc[i],after.iloc[i]))
return(aspect_cat)
Apply it (here with a pandas series):
aspect_series=pd.Series([52.93,38.35,194.84,299.53,24.81,259.13,66.14,292.85,195.72,27.85])
aspect_categories=categorize_aspect(aspect_series)
And you should get this:
Aspect (deg N) | Aspect quadrant
195.72 | S
259.13 | W
194.84 | S
194.84 | S
292.85 | NW
38.35 | NE
24.81 | NE
38.35 | NE
195.72 | S
195.72 | S
292.85 | NW
66.14 | NE
66.14 | NE
38.35 | NE
194.84 | S
195.72 | S
292.85 | NW
292.85 | NW
194.84 | S
66.14 | NE
Oh, and if you’re after a layer file for quickly colouring up your aspect grids in Arc, feel free to use this.