簡體   English   中英

通過第一列比較兩個numpy數組,並通過連接兩個數組創建第三個numpy數組

[英]Compare two numpy arrays by first Column and create a third numpy array by concatenating two arrays

我有兩個2d 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   ]]  

我可以很快將解決方案視為

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

如上面的評論所指出,似乎存在數據輸入錯誤

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])

通過使用intersect1d獲取 ab的第一列的交集 ,然后使用in1d與第二列的交集進行交叉引用,可以實現此目的。

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

然后找到在時間a不在b使用setdiff1d ,並通過把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.   ]])

以下內容適用於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)

比我勇敢的人可以嘗試做這一行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM