【问题标题】:Inserting a row into a NumPy array在 NumPy 数组中插入一行
【发布时间】:2016-05-14 13:29:01
【问题描述】:

我有:

A = np.array([[0,1,1],[0,3,2],[1,1,1],[1,5,2]])

其中 NumPy 数组根据第一个元素排序,然后是第二个元素,依此类推。

我想将[1,4,10] 插入A,这样输出将是:

A = array([[0,1,1],[0,3,2],[1,1,1],[1,4,10][1,5,2]])                 

我该怎么做?

【问题讨论】:

    标签: python arrays sorting numpy


    【解决方案1】:

    首先,用np.vstack 堆叠新的一维数组作为最后一行 -

    B = np.vstack((A,[1,4,10]))
    

    现在,为了保持考虑每行的第一个元素,然后是第二个元素的优先顺序,假设每行作为一个索引元组,然后得到排序的索引。这可以通过np.ravel_multi_index(B.T,B.max(0)+1) 来实现。然后,使用这些索引重新排列B 的行并获得所需的输出。因此,最终代码将是 -

    out = B[np.ravel_multi_index(B.T,B.max(0)+1).argsort()]
    

    似乎np.lexsort 有一个替代方法来获得尊重该优先级的排序索引,但从相反的意义上说。因此,我们需要逐行反转元素的顺序,使用lexsort,然后获取排序后的索引。然后这些索引可以用于索引到B,就像在以前的方法中一样,并为我们提供输出。因此,np.lexsort 的替代最终代码将是 -

    out = B[np.lexsort(B[:,::-1].T)]
    

    示例运行 -

    In [60]: A
    Out[60]: 
    array([[0, 1, 1],
           [0, 3, 2],
           [1, 1, 1],
           [1, 5, 2]])
    
    In [61]: B = np.vstack((A,[1,4,10]))
    
    In [62]: B
    Out[62]: 
    array([[ 0,  1,  1],
           [ 0,  3,  2],
           [ 1,  1,  1],
           [ 1,  5,  2],
           [ 1,  4, 10]])  # <= New row
    
    In [63]: B[np.ravel_multi_index(B.T,B.max(0)+1).argsort()]
    Out[63]: 
    array([[ 0,  1,  1],
           [ 0,  3,  2],
           [ 1,  1,  1],
           [ 1,  4, 10],   # <= New row moved here
           [ 1,  5,  2]])
    
    In [64]: B[np.lexsort(B[:,::-1].T)]
    Out[64]: 
    array([[ 0,  1,  1],
           [ 0,  3,  2],
           [ 1,  1,  1],
           [ 1,  4, 10],   # <= New row moved here
           [ 1,  5,  2]])
    

    【讨论】:

      猜你喜欢
      • 2015-08-24
      • 2021-12-17
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 2018-02-25
      • 1970-01-01
      • 2022-12-21
      相关资源
      最近更新 更多