2014-09-01 65 views
0

我有兩個2d numpy數組用於繪製模擬結果。通過第一列比較兩個numpy數組,並通過連接兩個數組創建第三個numpy數組

兩個數組ab的第一列包含時間間隔,第二列包含要繪製的數據。這兩個陣列具有不同的形狀a(500,2)b(600,2)。我想通過第一列比較這兩個numpy數組,並創建一個第三個數組,並在第一列a上找到匹配項。如果找不到匹配,則將0添加到第三列。

有沒有這樣做的numpy技巧?

例如:

a=[[0.002,0.998], 
    [0.004,0.997], 
    [0.006,0.996], 
    [0.008,0.995], 
    [0.010,0.993]] 

b= [[0.002,0.666], 
    [0.004,0.665], 
    [0.0041,0.664], 
    [0.0042,0.664], 
    [0.0043,0.664], 
    [0.0044,0.663], 
    [0.0045,0.663], 
    [0.0005,0.663], 
    [0.006,0.663], 
    [0.0061,0.662], 
    [0.008,0.661]] 

預期輸出

c= [[0.002,0.998,0.666],  
    [0.004,0.997,0.665],   
    [0.006,0.996,0.663],   
    [0.008,0.995,0.661], 
    [0.010,0.993, 0 ]] 
+0

您可以在不同的行上放置'a'和'b',以便將數據複製到IPython中嗎? – 2014-09-01 07:33:20

+0

我編輯了'a'和'b'兩條不同的行 – arun 2014-09-01 07:38:28

+0

'a'有6e-3,而'b'有6e-4,而'c'又有6e-3,在他們的第一列。這是數據錄入錯誤嗎? – 2014-09-01 07:42:47

回答

2

我能很快想辦法解決的

import numpy as np 

a = np.array([[0.002, 0.998], 
    [0.004, 0.997], 
    [0.006, 0.996], 
    [0.008, 0.995], 
    [0.010, 0.993]]) 

b = np.array([[0.002, 0.666], 
    [0.004, 0.665], 
    [0.0041, 0.664], 
    [0.0042, 0.664], 
    [0.0043, 0.664], 
    [0.0044, 0.663], 
    [0.0045, 0.663], 
    [0.0005, 0.663], 
    [0.0006, 0.663], 
    [0.00061, 0.662], 
    [0.0008, 0.661]]) 


c = [] 
for row in a: 
    index = np.where(b[:,0] == row[0])[0] 
    if np.size(index) != 0: 
     c.append([row[0], row[1], b[index[0], 1]]) 
    else: 
     c.append([row[0], row[1], 0]) 

print c 

正如上面的評論中指出,似乎有數據錄入錯誤

2
import numpy as np 
i = np.intersect1d(a[:,0], b[:,0]) 
overlap = np.vstack([i, a[np.in1d(a[:,0], i), 1], b[np.in1d(b[:,0], i), 1]]).T 
underlap = np.setdiff1d(a[:,0], b[:,0]) 
underlap = np.vstack([underlap, a[np.in1d(a[:,0], underlap), 1], underlap*0]).T 
fast_c = np.vstack([overlap, underlap]) 

這是通過服用ab使用intersect1d所述第一列的交叉點,然後使用in1d交叉引用該交點與所述第二列。

vstack垂直堆疊輸入的元素,並且需要轉置來獲得正確的尺寸(非常快的操作)。

然後使用setdiff1d找到a不在b中的時間,並通過將0放在第三列中來完成結果。

此打印出

array([[ 0.002, 0.998, 0.666], 
     [ 0.004, 0.997, 0.665], 
     [ 0.006, 0.996, 0. ], 
     [ 0.008, 0.995, 0. ], 
     [ 0.01 , 0.993, 0. ]]) 
0

既爲numpy的陣列和簡單的python列出了以下工作。

c = [[*x, y[1]] for x in a for y in b if x[0] == y[0]] 
d = [[*x, 0] for x in a if x[0] not in [y[0] for y in b]] 
c.extend(d) 

有人比我更勇敢可以嘗試做出這一行。

相關問題