【问题标题】:Insert data from one sorted array into another sorted array将数据从一个排序数组插入另一个排序数组
【发布时间】:2012-01-26 02:38:47
【问题描述】:

如果这里有人问过这个问题,我深表歉意 - 我已经在这里和 Tentative NumPy 教程中寻找答案。

我有 2 个 numpy 数组。第一个数组类似于:

1 0 0 0 0

2 0 0 0 0

3 0 0 0 0

4 0 0 0 0

5 0 0 0 0

6 0 0 0 0

7 0 0 0 0

8 0 0 0 0

(等等......实际上是〜700x10)

然后我有一个类似于

的第二个数组
3 1

4 18

5 2

(再次,更长 - 可能是 400 行左右)

第二个数组的第一列总是完全包含在第一个数组的第一列中

我想做的是将第二个数组的第二列作为现有列的一部分插入到第一个数组中,即:

数组a:

1 0 0 0 0

2 0 0 0 0

3 1 0 0 0

4 18 0 0 0

5 2 0 0 0

6 0 0 0 0

7 0 0 0 0

8 0 0 0 0

(我会依次填写每一列,但每列都涵盖了原始范围内的不同范围)

我的第一次尝试是按照 a[b[:,0],1]=b[:,1] 的方式将它们放入 b 的索引中,而不是值(即,在我上面的示例中,而不是填写第 3、4 和 5 行,我填写了 2、3 和 4)。我应该意识到这一点!

从那时起,我一直试图让它与 where() 一起非常不优雅地工作,我想我可以通过找出第一列的起始值的差异来让它工作。

我是 python 新手,所以也许我过于乐观 - 但似乎应该有一种更优雅的方式,我只是想念它。

感谢您的任何见解!

【问题讨论】:

    标签: python multidimensional-array numpy


    【解决方案1】:

    如果a的第一列中的数字是排序的,那么你可以使用

    a[a[:,0].searchsorted(b[:,0]),1] = b[:,1]
    

    例如:

    import numpy as np
    
    a = np.array([(1,0,0,0,0),
                  (2,0,0,0,0),
                  (3,0,0,0,0),
                  (4,0,0,0,0),
                  (5,0,0,0,0),
                  (6,0,0,0,0),
                  (7,0,0,0,0),
                  (8,0,0,0,0),
                  ])
    
    b = np.array([(3, 1),
                  (5, 18),
                  (7, 2)])
    
    a[a[:,0].searchsorted(b[:,0]),1] = b[:,1]
    print(a)
    

    产量

    [[ 1  0  0  0  0]
     [ 2  0  0  0  0]
     [ 3  1  0  0  0]
     [ 4  0  0  0  0]
     [ 5 18  0  0  0]
     [ 6  0  0  0  0]
     [ 7  2  0  0  0]
     [ 8  0  0  0  0]]
    

    (我稍微更改了您的示例以表明b 的第一列中的值不必是连续的。)


    如果a[:,0] 没有排序,那么您可以使用np.argsort 来解决此问题:

    a = np.array( [(1,0,0,0,0),
                   (2,0,0,0,0),
                   (5,0,0,0,0),
                   (3,0,0,0,0),
                   (4,0,0,0,0),
                   (6,0,0,0,0),
                   (7,0,0,0,0),
                   (8,0,0,0,0),
                   ])
    
    b = np.array([(3, 1),
                  (5, 18),
                  (7, 2)])
    
    perm = np.argsort(a[:,0])
    a[:,1][perm[a[:,0][perm].searchsorted(b[:,0])]] = b[:,1]
    print(a)
    

    产量

    [[ 1  0  0  0  0]
     [ 2  0  0  0  0]
     [ 5 18  0  0  0]
     [ 3  1  0  0  0]
     [ 4  0  0  0  0]
     [ 6  0  0  0  0]
     [ 7  2  0  0  0]
     [ 8  0  0  0  0]]
    

    【讨论】:

    • searchsorted?这些人很有创意。看起来“正是”OP想要的。 +1
    • a[a[:,0].searchsorted(b[:,0]),1] = b[:,1] 正是我所需要的——我知道必须有更多优雅的方式。谢谢!
    • @TopherHughes 如果它适合你,请接受 unutbu 的回答。
    【解决方案2】:

    设置:

    a = np.arange(20).reshape(2,10).T
    b = np.array([[1, 100], [3, 300], [8, 800]])
    

    如果您对 a[:, 0] 除了排序之外一无所知,这将起作用。

    index = a[:, 0].searchsorted(b[:, 0])
    a[index, 1] = b[:, 1]
    print a
    array([[  0,  10],
           [  1, 100],
           [  2,  12],
           [  3, 300],
           [  4,  14],
           [  5,  15],
           [  6,  16],
           [  7,  17],
           [  8, 800],
           [  9,  19]])
    

    但是,如果您知道 a[:, 0] 是一个连续整数序列,就像您的示例一样,您可以这样做:

    index = b[:,0] + a[0, 0]
    a[index, 1] = b[:, 1]
    

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 2014-10-25
      相关资源
      最近更新 更多