将一个已排序数组中的数据插入另一个已排序数组

Top*_*hes 2 python numpy multidimensional-array

如果在这里被问到这个问题我很抱歉 - 我已经在这里和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
Run Code Online (Sandbox Code Playgroud)

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

然后我有一个类似的第二个数组

3 1

4 18

5 2
Run Code Online (Sandbox Code Playgroud)

(再次,更长 - 可能是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
Run Code Online (Sandbox Code Playgroud)

(我将依次填写每个列,但每个列覆盖原始的不同范围)

我的第一次尝试是沿着[b [:,0],1] = b [:,1]的行,将它们放入b的索引中,而不是值(即,在上面的示例中,而不是填充行3,4和5,我填写2,3和4).我应该意识到了!

从那以后,我试图让它在where()中非常优雅地工作,我想我可以通过找到第一列的起始值的差异来使它工作.

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

感谢您的任何见解!

unu*_*tbu 5

如果第一列中的数字a按排序顺序排列,那么您可以使用

a[a[:,0].searchsorted(b[:,0]),1] = b[:,1]
Run Code Online (Sandbox Code Playgroud)

例如:

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)
Run Code Online (Sandbox Code Playgroud)

产量

[[ 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]]
Run Code Online (Sandbox Code Playgroud)

(我改变了你的例子,以表明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)
Run Code Online (Sandbox Code Playgroud)

产量

[[ 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]]
Run Code Online (Sandbox Code Playgroud)