2012-01-26 116 views
2

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

(也是第2个数组,长 - 也许400行左右)

第2个数组的第一列始终完全包含在第一个数组的第一列内

我想做的是对第二阵列的第二列插入到该第一阵列作为现有柱的部分,即:

阵列的:

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,所以也许我过于乐观 - 但它似乎应该有一个更优雅的方式,我只是想念它。

感谢您的任何见解!

回答

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]] 
+0

'searchsorted'?这些人很有创意。看起来像'完全'OP的想法。 +1 – heltonbiker

+0

a [a [:,0] .searchsorted(b [:,0]),1] = b [:,1]就是我所需要的 - 我知道必须有更优雅的方式。谢谢! –

+0

@TopherHughes如果它适合你,请接受unutbu的答案。 – nye17

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] 
+0

searchsorted正是我所需要的 - 非常感谢你 –