Hi, I am trying to do a slding window on a cube (3D array) to get the average over a block of vertical 1D arrays. I have achieved this using the stride_tricks.asstrided but this will load the whole cube into memory at once and is not suitable for large cubes. I have also achieved it using an nditer but this is a lot slower:
def trace_block(vol, x, y, half_window): return vol[x - half_window:x + half_window + 1, y - half_window:y + half_window + 1] vol = np.linspace(1, 125, 125, dtype=np.int32).reshape(5, 5, 5) window_size = 3 x, y, z = vol.shape half_window = (window_size - 1) // 2 xs = np.arange(half_window, x - half_window, dtype=np.int16) ys = np.arange(half_window, y - half_window, dtype=np.int16) averaged = np.zeros((5, 5, 5)) for x, y in np.nditer(np.ix_(xs, ys)): averaged[x, y] = np.mean(trace_block(vol, x, y, half_window), (0, 1)) My attempt at using numpy vectorisation to avoid the for loop throws the error in the subject: vol = np.linspace(1, 125, 125, dtype=np.int32).reshape(5, 5, 5) window_size = 3 x, y, z = vol.shape half_window = (window_size - 1) // 2 xs = np.arange(half_window, x - half_window, dtype=np.int16) ys = np.arange(half_window, y - half_window, dtype=np.int16) averaged = np.zeros((5, 5, 5)) xi, yi = np.ix_(xs, ys) averaged[xi, yi] = np.mean(trace_block(vol, xi, yi, half_window), (0, 1)) Is there any way to do slicing as shown in the trace_block function to support the xi and yi grid arrays? Any help you can provide will be greatly appreciated.
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion