2014-09-01 2 views
0

У меня есть два массива 2d numpy, которые используются для построения результатов моделирования.Сравните два массива numpy по первой колонке и создайте третий массив numpy, объединив два массива

Первый столбец обоих массивов a и b содержит временные интервалы, а второй столбец содержит данные, которые должны быть построены. Эти два массива имеют разные формы. 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? –

+0

Я отредактировал 'a' и 'b' для двух разных строк. – arun

+0

'a' имеет 6e-3, а' b' имеет 6e-4, а 'c' имеет 6e-3 снова в своих первых столбцах. Это ошибка ввода данных? –

ответ

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

Это работает, принимая пересечение первого столбца a и b с использованием intersect1d, а затем с помощью in1d для перекрестной ссылки, что пересечение со вторыми колоннами.

vstack складывает элементы входа по вертикали, и транспонирование необходимо для правильного измерения (очень быстрая работа).

Затем найдите время в a, которые не находятся в b, используя setdiff1d, и заполните результат, поставив 0s в третьей колонке.

Это печатает

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 массивов и простых списков питона.

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) 

Кто-то более смелый, чем я мог бы попытаться сделать эту линию.

Смежные вопросы