2013-05-16 184 views
1

我是新來numpy的,我不是專家,程序員在所有...
這是我的問題:NumPy的行替換

我有數組a和陣列b(B <一)。

我想用b(按順序)的所有行替換一些行a

要替換的a中的行與b行有一個共同的值。

例如:

a是:

1 a 2 

3 b 4 

0 z 0 

5 c 6 

0 y 0 

b

1 z 1 

1 y 1 

在這種情況下,我會希望用1代替在a行3和5和2 b 。這些數組非常大,並且如示例中那樣,有一些字符類型(所以我將該數組設置爲dtype=object)。

回答

1

首先,我會建議將您的dtypeobject更改爲[('a',int),('letter','S1'),('b',int)]。這樣做可以讓你有不同的dtypes列(注意該dtype列表的長度是列數)。然後,你必須:

In [63]: a = np.array(
    ....:   [(1,'a',2),(3,'b',4),(0,'z',0),(5,'c',6),(0,'y',0)], 
    ....:   dtype=[('a',int),('letter','S1'),('b',int)]) 

In [64]: a 
Out[64]: 
array([(1, 'a', 2), (3, 'b', 4), (0, 'z', 0), (5, 'c', 6), (0, 'y', 0)], 
     dtype=[('a', '<i8'), ('letter', 'S1'), ('b', '<i8')]) 

In [65]: a['a'] 
Out[65]: array([1, 3, 0, 5, 0]) 

In [66]: a['b'] 
Out[66]: array([2, 4, 0, 6, 0]) 

In [67]: a['letter'] 
Out[67]: 
array(['a', 'b', 'z', 'c', 'y'], 
     dtype='|S1') 

然後你可以使用b相同的D型:

In [69]: b = np.array([(1,'z',1),(1,'y',1)], dtype=a.dtype) 

In [70]: b 
Out[70]: 
array([(1, 'z', 1), (1, 'y', 1)], 
     dtype=[('a', '<i8'), ('letter', 'S1'), ('b', '<i8')]) 

In [71]: b['letter'] 
Out[71]: 
array(['z', 'y'], 
     dtype='|S1') 

現在,你可以簡單地用b其中字母相匹配的零件更換的a的部分:

In [73]: a 
Out[73]: 
array([(1, 'a', 2), (3, 'b', 4), (0, 'z', 0), (5, 'c', 6), (0, 'y', 0)], 
     dtype=[('a', '<i8'), ('letter', 'S1'), ('b', '<i8')]) 

In [74]: b 
Out[74]: 
array([(1, 'z', 1), (1, 'y', 1)], 
     dtype=[('a', '<i8'), ('letter', 'S1'), ('b', '<i8')]) 

In [75]: for row in b: 
    ....:  a[a['letter']==row['letter']] = row 
    ....:  

In [76]: a 
Out[76]: 
array([(1, 'a', 2), (3, 'b', 4), (1, 'z', 1), (5, 'c', 6), (1, 'y', 1)], 
     dtype=[('a', '<i8'), ('letter', 'S1'), ('b', '<i8')]) 
+0

它的工作!非常感謝! – Alice