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

Reply via email to