2017-02-09 9 views
1

у меня есть два массива (data и final), и я хотел бы сравнить оба массива и возвращают (out) элемент в data, которые не находятся в finalэффективно сравнения двух массивов разного размера

данных:

x  y  z 
10.2 15.2 25.2 
15.2 17.2 40.2 
12.2 13.2 5.2 
14.2 14.2 34.2 
12.2 12.2 56.2 
13.2 17.2 32.2 
11.2 13.2 21.2 

финал:

x  y  z 
15.2 17.2 40.2 
14.2 14.2 34.2 
12.2 12.2 56.2 

из:

x  y  z 
10.2 15.2 25.2 
12.2 13.2 5.2 
13.2 17.2 32.2 
11.2 13.2 21.2 

Это то, что я сделал,

out = [np.column_stack(data[k]) for k in range(len(data)) if data[k] not in final] 
out = np.vstack(out) 

Проблема

Проблема у меня есть, я должен выполнить это действие получать мои out около 10000 раз (пример только один из 10000), и такая скорость является моей главной задачей.

Есть ли эффективный способ выполнения этого?

+0

@Divakar, то np.ravel_multi_index работает с целыми числами. что, если мои данные имеют тип float64 – user7436576

+0

Сколько столбцов у вас в вашем фактическом случае? – Divakar

+0

@Divakar, у меня есть 3 столбца для 'final' и' data' – user7436576

ответ

1

Вот один подход -

def remrows(a, b): # remove rows from a based on b 
    ab = np.row_stack((a,b)) 
    sidx = np.lexsort(ab.T) 
    ab_sorted = ab[sidx] 
    idx = np.flatnonzero((ab_sorted[1:] == ab_sorted[:-1]).all(1)) 
    return np.delete(a, sidx[idx], axis=0) 

Если вы хотите, чтобы объяснить какой-то толерантности при сравнении этих чисел с плавающей пт значения, вы можете захотеть использовать np.isclose() вместо == на idx этапе.

Пример запуска -

In [222]: a = np.random.randint(111,999,(10,3)).astype(float)/10.0 

In [223]: a 
Out[223]: 
array([[ 51.3, 66.3, 58.8], 
     [ 24.3, 40.6, 37.8], 
     [ 94.7, 28.8, 69.3], 
     [ 21.8, 48.3, 57.5], 
     [ 87.1, 81.9, 27.9], 
     [ 14.2, 36.4, 22.2], 
     [ 56.7, 58.7, 16.2], 
     [ 66.2, 99.1, 62.5], 
     [ 75.1, 27.8, 34.4], 
     [ 59.7, 73.8, 22.3]]) 

In [224]: b = a[[1,3,5]] 

In [225]: remrows(a, b) 
Out[225]: 
array([[ 51.3, 66.3, 58.8], 
     [ 94.7, 28.8, 69.3], 
     [ 87.1, 81.9, 27.9], 
     [ 56.7, 58.7, 16.2], 
     [ 66.2, 99.1, 62.5], 
     [ 75.1, 27.8, 34.4], 
     [ 59.7, 73.8, 22.3]]) 

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

  • Нет связанных вопросов^_^