Scipy ndimage morphology … I am betting that is the first thought that popped into your head. A new set of tools for the raster arsenal.
But wait! Their terminology is different than that used by ArcGIS Pro or even ArcMap.
What tools are there? Lots of filtering tools, but some of the interesting ones are below
from scipy import ndimage as nd
dir(nd)[... snip ...
'affine_transform', ... , 'center_of_mass', 'convolve', 'convolve1d', 'correlate',
'correlate1d', ... 'distance_transform_edt', ... 'filters', ... 'generic_filter',
... 'geometric_transform', ... 'histogram', 'imread', 'interpolation', ... 'label',
'labeled_comprehension', ... 'measurements', ... 'morphology', ... 'rotate', 'shift',
'sobel',...]<SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
I previously covered distance_transform_edt which performs the equivalent of Euclidean Distance and Euclidean Allocation in this post
/blogs/dan_patterson/2018/10/04/euclidean-distance-allocation-and-other-stuff
Let's begin with a raster constructed from 3x3 windows with a repeating pattern and repeats of the pattern.
You can construct your own rasters using numpy, then apply a NumPyArrayToRaster to it. I have covered this before, but here is the code to produce the raster
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">_make_arr_</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">"""Make an array with repeating patterns
"""</SPAN>
a <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>arange<SPAN class="punctuation token">(</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">10</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN>reshape<SPAN class="punctuation token">(</SPAN><SPAN class="number token">3</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">3</SPAN><SPAN class="punctuation token">)</SPAN>
aa <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>repeat<SPAN class="punctuation token">(</SPAN>np<SPAN class="punctuation token">.</SPAN>repeat<SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">,</SPAN> <SPAN class="number token">3</SPAN><SPAN class="punctuation token">,</SPAN> axis<SPAN class="operator token">=</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">3</SPAN><SPAN class="punctuation token">,</SPAN> axis<SPAN class="operator token">=</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN>
aa <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>tile<SPAN class="punctuation token">(</SPAN>aa<SPAN class="punctuation token">,</SPAN> <SPAN class="number token">3</SPAN><SPAN class="punctuation token">)</SPAN>
aa <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>vstack<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>aa<SPAN class="punctuation token">,</SPAN> aa<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">return</SPAN> aa<SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
---- The raster (image) ----

---- (1) Expand ----
Expand the zone 1 values by 2 distance units

---- (2) Shrink ----
Shrink the zone 1 values by 1 distance unit.

---- (3) Regiongroup ----
Produce unique regions from the zones. observe that the zone 1 values in the original are given unique values first. Since there were 6 zone 1s, they are numbered from 1 to 6. Zone 2 gets numbered from 7 to 12. and that pattern of renumbering repeats.

---- (4) Aggregate ----
Aggregation of the input array using the mode produces a spatial aggregation retaining the original values. Our original 3x3 kernels are now reduced to a 1x1 size which has 3 times the width and height (9x area).

---- (5) Some functions to perform the above ----
In these examples buff_dist is referring to 'cells'.
For the aggregation, there are a number of options as shown in the header.
Generally integer data should be restricted to the mode, min, max, range and central (value) since the median and mean upscale to floating point values. This of course can be accommodated by using the python statistics package median_low and median_high functions:
statistics — Mathematical statistics functions — Python 3.7.1rc1 documentation
So think of a function that you want. Filtering is a snap since you can 'stride' an array using any kernel you want using plain numpy or using the builtin functions from scipy.
Enough for now...
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">expand_</SPAN><SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">,</SPAN> val<SPAN class="operator token">=</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN> mask_vals<SPAN class="operator token">=</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN> buff_dist<SPAN class="operator token">=</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">"""Expand/buffer a raster by a distance
"""</SPAN>
<SPAN class="keyword token">if</SPAN> isinstance<SPAN class="punctuation token">(</SPAN>val<SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN>list<SPAN class="punctuation token">,</SPAN> tuple<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
m <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>isin<SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">,</SPAN> val<SPAN class="punctuation token">,</SPAN> invert<SPAN class="operator token">=</SPAN><SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN>astype<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'int'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN>
m <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>where<SPAN class="punctuation token">(</SPAN>a<SPAN class="operator token">==</SPAN>val<SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">1</SPAN><SPAN class="punctuation token">)</SPAN>
dist<SPAN class="punctuation token">,</SPAN> idx <SPAN class="operator token">=</SPAN> nd<SPAN class="punctuation token">.</SPAN>distance_transform_edt<SPAN class="punctuation token">(</SPAN>m<SPAN class="punctuation token">,</SPAN> return_distances<SPAN class="operator token">=</SPAN><SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">,</SPAN>
return_indices<SPAN class="operator token">=</SPAN><SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">)</SPAN>
alloc <SPAN class="operator token">=</SPAN> a<SPAN class="punctuation token">[</SPAN>tuple<SPAN class="punctuation token">(</SPAN>idx<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN>
a0 <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>where<SPAN class="punctuation token">(</SPAN>dist<SPAN class="operator token"><=</SPAN>buff_dist<SPAN class="punctuation token">,</SPAN> alloc<SPAN class="punctuation token">,</SPAN> a<SPAN class="punctuation token">)</SPAN> <SPAN class="comment token">#0)</SPAN>
<SPAN class="keyword token">return</SPAN> a0
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">shrink_</SPAN><SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">,</SPAN> val<SPAN class="operator token">=</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN> mask_vals<SPAN class="operator token">=</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN> buff_dist<SPAN class="operator token">=</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">"""Expand/buffer a raster by a distance
"""</SPAN>
<SPAN class="keyword token">if</SPAN> isinstance<SPAN class="punctuation token">(</SPAN>val<SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN>list<SPAN class="punctuation token">,</SPAN> tuple<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
m <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>isin<SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">,</SPAN> val<SPAN class="punctuation token">,</SPAN> invert<SPAN class="operator token">=</SPAN><SPAN class="token boolean">False</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN>astype<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'int'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN>
m <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>where<SPAN class="punctuation token">(</SPAN>a<SPAN class="operator token">==</SPAN>val<SPAN class="punctuation token">,</SPAN> <SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN>
dist<SPAN class="punctuation token">,</SPAN> idx <SPAN class="operator token">=</SPAN> nd<SPAN class="punctuation token">.</SPAN>distance_transform_edt<SPAN class="punctuation token">(</SPAN>m<SPAN class="punctuation token">,</SPAN> return_distances<SPAN class="operator token">=</SPAN><SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">,</SPAN>
return_indices<SPAN class="operator token">=</SPAN><SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">)</SPAN>
alloc <SPAN class="operator token">=</SPAN> a<SPAN class="punctuation token">[</SPAN>tuple<SPAN class="punctuation token">(</SPAN>idx<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN>
m <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>logical_and<SPAN class="punctuation token">(</SPAN>dist<SPAN class="operator token">></SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN> dist<SPAN class="operator token"><=</SPAN>buff_dist<SPAN class="punctuation token">)</SPAN>
a0 <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>where<SPAN class="punctuation token">(</SPAN>m<SPAN class="punctuation token">,</SPAN> alloc<SPAN class="punctuation token">,</SPAN> a<SPAN class="punctuation token">)</SPAN> <SPAN class="comment token">#0)</SPAN>
<SPAN class="keyword token">return</SPAN> a0
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">regions_</SPAN><SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">,</SPAN> cross<SPAN class="operator token">=</SPAN><SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">"""currently testing regiongroup
np.unique will return values in ascending order
"""</SPAN>
<SPAN class="keyword token">if</SPAN> <SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">.</SPAN>ndim <SPAN class="operator token">!=</SPAN> <SPAN class="number token">2</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">or</SPAN> <SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">.</SPAN>dtype<SPAN class="punctuation token">.</SPAN>kind <SPAN class="operator token">!=</SPAN> <SPAN class="string token">'i'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
msg <SPAN class="operator token">=</SPAN> <SPAN class="string token">"\nA 2D array of integers is required, you provided\n{}"</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN>msg<SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">return</SPAN> a
<SPAN class="keyword token">if</SPAN> cross<SPAN class="punctuation token">:</SPAN>
struct <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>array<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN>
struct <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>array<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#</SPAN>
u <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>unique<SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">)</SPAN>
out <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>zeros_like<SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">,</SPAN> dtype<SPAN class="operator token">=</SPAN>a<SPAN class="punctuation token">.</SPAN>dtype<SPAN class="punctuation token">)</SPAN>
details <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN>
is_first <SPAN class="operator token">=</SPAN> <SPAN class="token boolean">True</SPAN>
<SPAN class="keyword token">for</SPAN> i <SPAN class="keyword token">in</SPAN> u<SPAN class="punctuation token">:</SPAN>
z <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>where<SPAN class="punctuation token">(</SPAN>a<SPAN class="operator token">==</SPAN>i<SPAN class="punctuation token">,</SPAN> <SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN>
s<SPAN class="punctuation token">,</SPAN> n <SPAN class="operator token">=</SPAN> nd<SPAN class="punctuation token">.</SPAN>label<SPAN class="punctuation token">(</SPAN>z<SPAN class="punctuation token">,</SPAN> structure<SPAN class="operator token">=</SPAN>struct<SPAN class="punctuation token">)</SPAN>
details<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">[</SPAN>i<SPAN class="punctuation token">,</SPAN> n<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
m <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>logical_and<SPAN class="punctuation token">(</SPAN>out<SPAN class="operator token">==</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN> s<SPAN class="operator token">!=</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> is_first<SPAN class="punctuation token">:</SPAN>
out <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>where<SPAN class="punctuation token">(</SPAN>m<SPAN class="punctuation token">,</SPAN> s<SPAN class="punctuation token">,</SPAN> out<SPAN class="punctuation token">)</SPAN>
is_first <SPAN class="operator token">=</SPAN> <SPAN class="token boolean">False</SPAN>
n_ <SPAN class="operator token">=</SPAN> n
<SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN>
out <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>where<SPAN class="punctuation token">(</SPAN>m<SPAN class="punctuation token">,</SPAN> s<SPAN class="operator token">+</SPAN>n_<SPAN class="punctuation token">,</SPAN> out<SPAN class="punctuation token">)</SPAN>
n_ <SPAN class="operator token">+=</SPAN> n
details <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>array<SPAN class="punctuation token">(</SPAN>details<SPAN class="punctuation token">)</SPAN>
details <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>c_<SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">(</SPAN>details<SPAN class="punctuation token">,</SPAN> np<SPAN class="punctuation token">.</SPAN>cumsum<SPAN class="punctuation token">(</SPAN>details<SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">return</SPAN> out<SPAN class="punctuation token">,</SPAN> details
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">aggreg_</SPAN><SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">,</SPAN> win<SPAN class="operator token">=</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="number token">3</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">3</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> agg_type<SPAN class="operator token">=</SPAN><SPAN class="string token">'mode'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">"""Aggregate an array using a specified window size and an aggregation
type
Parameters
----------
a : array
2D array to perform the aggregation
win : tuple/list
the shape of the window to construct the blocks
agg_type : string aggregation type
max, mean, median, min, mode, range, sum, central
"""</SPAN>
blocks <SPAN class="operator token">=</SPAN> block<SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">,</SPAN> win<SPAN class="operator token">=</SPAN>win<SPAN class="punctuation token">)</SPAN>
out <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">for</SPAN> bl <SPAN class="keyword token">in</SPAN> blocks<SPAN class="punctuation token">:</SPAN>
b_arr <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">for</SPAN> b <SPAN class="keyword token">in</SPAN> bl<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">if</SPAN> agg_type <SPAN class="operator token">==</SPAN> <SPAN class="string token">'mode'</SPAN><SPAN class="punctuation token">:</SPAN>
uni <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>unique<SPAN class="punctuation token">(</SPAN>b<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN>tolist<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
cnts <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>len<SPAN class="punctuation token">(</SPAN>np<SPAN class="punctuation token">.</SPAN>nonzero<SPAN class="punctuation token">(</SPAN>b<SPAN class="operator token">==</SPAN>u<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">for</SPAN> u <SPAN class="keyword token">in</SPAN> uni<SPAN class="punctuation token">]</SPAN>
idx <SPAN class="operator token">=</SPAN> cnts<SPAN class="punctuation token">.</SPAN>index<SPAN class="punctuation token">(</SPAN>max<SPAN class="punctuation token">(</SPAN>cnts<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
b_arr<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>uni<SPAN class="punctuation token">[</SPAN>idx<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">elif</SPAN> agg_type <SPAN class="operator token">==</SPAN> <SPAN class="string token">'max'</SPAN><SPAN class="punctuation token">:</SPAN>
b_arr<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>np<SPAN class="punctuation token">.</SPAN>nanmax<SPAN class="punctuation token">(</SPAN>b<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">elif</SPAN> agg_type <SPAN class="operator token">==</SPAN> <SPAN class="string token">'mean'</SPAN><SPAN class="punctuation token">:</SPAN>
b_arr<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>np<SPAN class="punctuation token">.</SPAN>nanmean<SPAN class="punctuation token">(</SPAN>b<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">elif</SPAN> agg_type <SPAN class="operator token">==</SPAN> <SPAN class="string token">'median'</SPAN><SPAN class="punctuation token">:</SPAN>
b_arr<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>np<SPAN class="punctuation token">.</SPAN>nanmedian<SPAN class="punctuation token">(</SPAN>b<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">elif</SPAN> agg_type <SPAN class="operator token">==</SPAN> <SPAN class="string token">'min'</SPAN><SPAN class="punctuation token">:</SPAN>
b_arr<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>np<SPAN class="punctuation token">.</SPAN>nanmin<SPAN class="punctuation token">(</SPAN>b<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">elif</SPAN> agg_type <SPAN class="operator token">==</SPAN> <SPAN class="string token">'range'</SPAN><SPAN class="punctuation token">:</SPAN>
b_arr<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>np<SPAN class="punctuation token">.</SPAN>nanmax<SPAN class="punctuation token">(</SPAN>b<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">-</SPAN> np<SPAN class="punctuation token">.</SPAN>nanmin<SPAN class="punctuation token">(</SPAN>b<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">elif</SPAN> agg_type <SPAN class="operator token">==</SPAN> <SPAN class="string token">'sum'</SPAN><SPAN class="punctuation token">:</SPAN>
b_arr<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>np<SPAN class="punctuation token">.</SPAN>nansum<SPAN class="punctuation token">(</SPAN>b<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">elif</SPAN> agg_type <SPAN class="operator token">==</SPAN> <SPAN class="string token">'central'</SPAN><SPAN class="punctuation token">:</SPAN>
b_arr<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>b<SPAN class="punctuation token">.</SPAN>shape<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="operator token">//</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">,</SPAN> b<SPAN class="punctuation token">.</SPAN>shape<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="operator token">//</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN>
tweet<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"\naggregation type not found {}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>agg_type<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
b_arr<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>b<SPAN class="punctuation token">.</SPAN>shape<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="operator token">//</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">,</SPAN> b<SPAN class="punctuation token">.</SPAN>shape<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="operator token">//</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">)</SPAN>
out<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>b_arr<SPAN class="punctuation token">)</SPAN>
out <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>array<SPAN class="punctuation token">(</SPAN>out<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">return</SPAN> out
<SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>