代码之家  ›  专栏  ›  技术社区  ›  Mehdi

移动矩阵行,使最大值位于中间

  •  2
  • Mehdi  · 技术社区  · 10 年前

    这可以用for循环和条件来实现,但有没有一种快速有效的方法可以使用Python和numpy来实现,因为我正在处理具有十万行的矩阵。

    例如,我们有一个3行的小矩阵

    1, 3, 4, 10, 2, 4, 1
    
    2, 4, 10, 1, 1, 1, 2
    
    1, 4, 7, 5, 4, 10, 1
    

    因此,我希望循环移动行,使每行的最大值位于中间

    1, 3, 4, 10, 2, 4, 1
    
    2, 2, 4, 10, 1, 1, 1
    
    7, 5, 4, 10, 1, 1, 4
    

    我想的是这样的:

    middle = matrix.shape[1]/2
    for row in range(0, matrix.shape[0]):
        max_index = np.argmax(matrix[row, :])
        np.roll(matrix[row, :], middle-max_index)
    

    我认为argmax可以提取所有行的所有最大值索引。但是如何对每一行应用不同的移位,np。roll不提供shift必须是int而不是数组这样的功能。

    1 回复  |  直到 10 年前
        1
  •  4
  •   Divakar    10 年前

    这将是一个 vectorized 方法,假设 A 作为输入阵列-

    # Get shape info and the middle column index
    M,N = A.shape 
    mid_col_idx = int(N/2)
    
    # Get required shifts for each row
    shifts = mid_col_idx - np.argmax(A,axis=1)
    
    # Get offsetted column indices
    offsetted_col_idx = np.mod(np.arange(N) - shifts[:,None],N)
    
    # Finally generate correctly ordered linear indices for all elements 
    # and set them in A in one-go
    Aout = A.ravel()[offsetted_col_idx + N*np.arange(M)[:,None]]
    

    样品运行-

    In [74]: A
    Out[74]: 
    array([[ 1,  3,  4, 10,  2,  4,  1],
           [ 2,  4, 10,  1,  1,  1,  2],
           [ 1,  4,  7,  5,  4, 10,  1]])
    
    In [75]: Aout
    Out[75]: 
    array([[ 1,  3,  4, 10,  2,  4,  1],
           [ 2,  2,  4, 10,  1,  1,  1],
           [ 7,  5,  4, 10,  1,  1,  4]])