def fill_arr(a, win=(3, 3)): """try filling an array""" # fd = np.array([[32, 64, 128], [16, 0, 1], [8, 4, 2]]) # flow direction # if (zone < a.min()) or (zone > a.max()) or (zone is None): # print("\nYou need a zone that is within the range of values.") # return a, None if win[0] == 3: pr = 1 else: pr = 0 ap = np.pad(a, pad_width=(1, pr), mode="constant", constant_values=(0, 0)) if win == (2, 2): a_c = ap[1:, 1:] # for 2x2 even #w, h = win elif win == (3, 3): #w, h = win a_c = ap[1:-1, 1:-1] # for 3x3 odd a_s = stride(a_c, win=win) # stride the array r, c = a_s.shape[:2] out = [] x = a_s.shape[0] y = a_s.shape[1] for i in range(x): for j in range(y): # do stuff sub = a_s[i, j].ravel() edges = np.asarray([sub[:4], sub[5:]]).ravel() e_min = edges[np.argmin(edges)] if sub[4] < e_min: out.append(e_min) else: out.append(sub[4]) out = np.asarray(out).reshape(r, c) return out # , a_s, ap, a_c
def expand_zone(a, zone=None, win=2): """Expand a value (zone) in a 2D array, normally assumed to represent a raster surface. `zone` : number The value/class to expand into the surrounding cells `win` : list/tuple select a (2, 2) or (3, 3) moving window """ msg = "\nYou need a zone that is within the range of values." if (zone is None): print(msg) return a, None elif (zone < a.min()) or (zone > a.max()): print(msg) return a, None if win not in (2, 3): win = 2 p = [1, 0][win == 2] # check for 2 or 3 in win ap = np.pad(a, pad_width=(1, p), mode="constant", constant_values=(0, 0)) n, m = ap.shape if win == 2: a_c = ap[1:, 1:] # for 2x2 even elif win == 3: a_c = ap[1:-1, 1:-1] # for 3x3 odd a_s = stride(ap, win=(win, win), stepby=(win, win)) # stride the array r, c = a_s.shape[:2] out = [] x = a_s.shape[0] y = a_s.shape[1] for i in range(x): for j in range(y): if zone in a_s[i, j]: out.append(1) else: out.append(0) out1 = np.asarray(out).reshape(r, c) out = np.repeat(np.repeat(out1, 2, axis=1), 2, axis=0) dx, dy = np.array(out.shape) - np.array(a.shape) if dx != 0: out = out[:dx, :dy] final = np.where(out == 1, zone, a_c) return final
def expand_zone(a, zone=None, win=2): """Expand a value (zone) in a 2D array, normally assumed to represent a : raster surface. :zone - the value/class to expand into the surrounding cells :win - select a (2, 2) or (3, 3) moving window : """ msg = "\nYou need a zone that is within the range of values." if zone is None: print(msg) return a, None if (zone < a.min()) or (zone > a.max()): print(msg) return a, None if win not in (2, 3): win = 2 p = [1, 0][win == 2] # check for 2 or 3 in win ap = np.pad(a, pad_width=(1, p), mode="constant", constant_values=(0, 0)) #n, m = ap.shape if win == 2: a_c = ap[1:, 1:] # for 2x2 even elif win == 3: a_c = ap[1:-1, 1:-1] # for 3x3 odd a_s = stride(ap, win=(win, win), stepby=(win, win)) # stride the array r, c = a_s.shape[:2] out = [] x = a_s.shape[0] y = a_s.shape[1] for i in range(x): for j in range(y): if zone in a_s[i, j]: out.append(1) else: out.append(0) out1 = np.asarray(out).reshape(r, c) out = np.repeat(np.repeat(out1, 2, axis=1), 2, axis=0) dx, dy = np.array(out.shape) - np.array(a.shape) if dx != 0: out = out[:dx, :dy] final = np.where(out == 1, zone, a_c) return final