代码之家  ›  专栏  ›  技术社区  ›  Huanian Zhang

从一个大的2D NumPy数组中提取不同大小的子行

  •  -2
  • Huanian Zhang  · 技术社区  · 6 年前

    我有一个核数组,大小是 3*10 ,我想从每一行中提取不同大小的子行。子行居中于像素大小不同的中间像素。然后取每个代位的平均数。下面是一个伪示例:

    import numpy as np
    arr = np.arange(1,31).reshape((3,10))
    pixel_size = np.array([2,3,1])
    ## the subrow centers in the middle of the array, index 5
    mask = [[5-2:5+2],[5-3:5+3],[5-1:5+1]] ## index for each row
    ### submatrix = arr[;,mask]
    submatrix = [[3,4,5,6],[12,13,14,15,16,17],[24,25]]
    ## output = np.mean(submatrix, axis=1) output is the average number of each row in the submatrix
    output = [4.5,14.5,24.5]
    

    如果我有超过一千万行,我怎么能快速处理这种情况。

    1 回复  |  直到 6 年前
        1
  •  3
  •   berkelem    6 年前

    可以使用列表理解和索引切片来完成此操作:

    import numpy as np
    
    arr = np.arange(1,31).reshape((3,10))
    pixel_size = np.array([2,3,1])
    
    middle_ind = int(arr.shape[1]/2.)
    print middle_ind
    sub_arr = [arr[i,middle_ind - pixel_size[i]:middle_ind + pixel_size[i]] for i in range(len(pixel_size))]
    print('sub_arr: ', sub_arr)
    output = [np.mean(item) for item in sub_arr]
    print('output: ', output)
    
    > sub_arr: [array([4, 5, 6, 7]), array([13, 14, 15, 16, 17, 18]), array([25, 26])]
    > output: [5.5, 15.5, 25.5]
    

    你的子矩阵是一个列表而不是一个数组,所以它更难向量化操作。您可能想重新构造代码以利用矩阵运算。