I have a source raster data set (tif file) and a number of polygon features. For each one of those polygons I need to:

a) 'clip' the raster.  
b) change values of those clipped raster cells (with the average value).  
c) write new values back to the source raster.

I've managed to do a and b, which means I now have a `numpy.ndarray` variable where all cells have been populated with the average value. How can I write this back to the source raster?


I believe I'd be able to write a script which could do such a thing. I have arrays dimensions (width and height) and top left cell's position, so I guess it'd just be a matter of operating with these arrays. However, I was wondering whether there's any existing function that does that already.


My code:

    import os, sys, datetime, time
    import geopandas as gpd
    import gdal
    import rasterio
    from rasterio.mask import mask
    from fiona.crs import from_epsg
    import numpy as np
    import pycrs
    
    alr_path = r'Z:\GRAU_Team_Admin\Alfonso Jimenez\Flood Modelling\Building Footprint\OUTPUT\NI_RIVER_ALR_1000.tif'
    
    gdb_vml_polygs = r'\\lwukwvdi11\data\Data\UK\UK_Mapping\VML\data\Europa20190403\RSA_VML_BUILDINGS_NI.gdb'
    fc_vml_polygs = r'VML_Buildings_NI'
    
    alr = rasterio.open(alr_path)
    
    vml_polygs = gpd.read_file(gdb_vml_polygs, driver='FileGDB', layer=fc_vml_polygs)
    
    for index, row in vml_polygs.iterrows():
        #row[3] contains the geometry
        window, out_transform = mask(alr, row[3], all_touched=True, crop=True)
        if np.all([window < 0]):
            avg = -1
        else:
            avg = window[window != -1].mean().item()
            window_avg = (np.where(window!=-1, int(round(avg,0)), window))



In the script `window_avg` is a numpy array containing the new values. How can I write these values back into the source raster?