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

时间:2012-01-26 02:38:48

标签: python multidimensional-array numpy

如果在这里被问到这个问题我很抱歉 - 我已经在这里以及在暂定的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

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

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

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

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

感谢您的任何见解!

2 个答案:

答案 0 :(得分:5)

如果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]]

答案 1 :(得分:0)

设置:

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

如果您对[:,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]