Generalize stacking of array elements' neighbors into 3-D array

后端 未结 1 1657
旧巷少年郎
旧巷少年郎 2021-01-14 02:46

Setup

Given a 2D array, I would like to create a 3D array where the values along the third dimension at (i.e. stacked[row, col, :]) are the flattened

1条回答
  •  野趣味
    野趣味 (楼主)
    2021-01-14 03:04

    This could be one approach -

    import numpy as np
    
    # Parameters
    R = 3  # Radius
    M1,N1 = padded.shape
    rowlen = N1 - R + 1
    collen = M1 - R + 1
    
    # Linear indices for the starting R x R block
    idx1 = np.arange(R)[:,None]*N1 + np.arange(R)
    
    # Offset (from the starting block indices) linear indices for all the blocks
    idx2 = np.arange(collen)[:,None]*N1 + np.arange(rowlen)
    
    # Finally, get the linear indices for all blocks
    all_idx = idx1.ravel()[None,None,:] + idx2[:,:,None]
    
    # Index into padded for the final output
    out = padded.ravel()[all_idx] 
    

    Here's a sample run for radius, R = 4 -

    In [259]: padded
    Out[259]: 
    array([[ 5,  5,  0,  3,  3,  3],
           [ 5,  5,  0,  3,  3,  3],
           [ 7,  7,  9,  3,  5,  5],
           [ 2,  2,  4,  7,  6,  6],
           [ 8,  8,  8, 10,  1,  1],
           [ 6,  6,  7,  7,  8,  8],
           [ 6,  6,  7,  7,  8,  8]])
    
    In [260]: out
    Out[260]: 
    array([[[ 5,  5,  0,  3,  5,  5,  0,  3,  7,  7,  9,  3,  2,  2,  4,  7],
            [ 5,  0,  3,  3,  5,  0,  3,  3,  7,  9,  3,  5,  2,  4,  7,  6],
            [ 0,  3,  3,  3,  0,  3,  3,  3,  9,  3,  5,  5,  4,  7,  6,  6]],
    
           [[ 5,  5,  0,  3,  7,  7,  9,  3,  2,  2,  4,  7,  8,  8,  8, 10],
            [ 5,  0,  3,  3,  7,  9,  3,  5,  2,  4,  7,  6,  8,  8, 10,  1],
            [ 0,  3,  3,  3,  9,  3,  5,  5,  4,  7,  6,  6,  8, 10,  1,  1]],
    
           [[ 7,  7,  9,  3,  2,  2,  4,  7,  8,  8,  8, 10,  6,  6,  7,  7],
            [ 7,  9,  3,  5,  2,  4,  7,  6,  8,  8, 10,  1,  6,  7,  7,  8],
            [ 9,  3,  5,  5,  4,  7,  6,  6,  8, 10,  1,  1,  7,  7,  8,  8]],
    
           [[ 2,  2,  4,  7,  8,  8,  8, 10,  6,  6,  7,  7,  6,  6,  7,  7],
            [ 2,  4,  7,  6,  8,  8, 10,  1,  6,  7,  7,  8,  6,  7,  7,  8],
            [ 4,  7,  6,  6,  8, 10,  1,  1,  7,  7,  8,  8,  7,  7,  8,  8]]])
    

    0 讨论(0)
提交回复
热议问题