2015-04-26 3 views
2

У меня есть два массива:быстрый способ сравнения двух массивов Numpy

>>> import numpy as np 
>>> a=np.array([2, 1, 3, 3, 3]) 
>>> b=np.array([1, 2, 3, 3, 3]) 

Какой самый быстрый способ сравнения этих двух массивов на равенство элементов, независимо от того?

EDIT я измерил для времени выполнения следующих функций:

def compare1():  #works only for arrays without redundant elements 
    a=np.array([1,2,3,5,4]) 
    b=np.array([2,1,3,4,5]) 
    temp=0 
    for i in a: 
     temp+=len(np.where(b==i)[0]) 
    if temp==5: 
      val=True 
    else: 
      val=False 
    return 0 

def compare2(): 
    a=np.array([1,2,3,3,3]) 
    b=np.array([2,1,3,3,3]) 
    val=np.all(np.sort(a)==np.sort(b)) 
    return 0 

def compare3():      #thx to ODiogoSilva 
    a=np.array([1,2,3,3,3]) 
    b=np.array([2,1,3,3,3]) 
    val=set(a)==set(b) 
    return 0 

import numpy.lib.arraysetops as aso 
def compare4():      #thx to tom10 
    a=np.array([1,2,3,3,3]) 
    b=np.array([2,1,3,3,3]) 
    val=len(aso.setdiff1d(a,b))==0 
    return 0 

Результаты являются:

>>> import timeit 
>>> timeit.timeit(compare1,number=1000) 
0.0166780948638916 
>>> timeit.timeit(compare2,number=1000) 
0.016178131103515625 
>>> timeit.timeit(compare3,number=1000) 
0.008063077926635742 
>>> timeit.timeit(compare4,number=1000) 
0.03257489204406738 

Похоже "набор" -метода по ODiogoSilva является самым быстрым ,

Знаете ли вы другие методы, которые я могу проверить?

EDIT2 Среда выше была не правильная мера для сравнения массивов, как описано в комментарии по user2357112.

#test.py 
import numpy as np 
import numpy.lib.arraysetops as aso 

#without duplicates 
N=10000 
a=np.arange(N,0,step=-2) 
b=np.arange(N,0,step=-2) 

def compare1(): 
    temp=0 
    for i in a: 
     temp+=len(np.where(b==i)[0]) 
    if temp==len(a): 
     val=True 
    else: 
     val=False 
    return val 
def compare2(): 
    val=np.all(np.sort(a)==np.sort(b)) 
    return val 
def compare3(): 
    val=set(a)==set(b) 
    return val 
def compare4(): 
    val=len(aso.setdiff1d(a,b))==0 
    return val 

Выход:

>>> from test import * 
>>> import timeit 
>>> timeit.timeit(compare1,number=1000) 
101.16708397865295 
>>> timeit.timeit(compare2,number=1000) 
0.09285593032836914 
>>> timeit.timeit(compare3,number=1000) 
1.425955057144165 
>>> timeit.timeit(compare4,number=1000) 
0.44780397415161133 

Теперь compare2 является самым быстрым. Есть ли еще способ, который мог бы превзойти это?

+0

Вы просто хотите знать, есть ли у них одинаковые элементы? В этом случае 1,2,3? – ODiogoSilva

+1

Сортируйте оба, затем просто сравните, я думаю. –

+0

@ODiogoSilva Да, моя первая попытка - просто посмотреть, содержат ли эти массивы 1,2,3 – Andy

ответ

1

Чтобы увидеть, если оба массива содержат такие же элементы, в этом случае [1,2,3], вы можете сделать:

import numpy as np 
a=np.array([2, 1, 3, 3, 3]) 
b=np.array([1, 2, 3, 3, 3]) 

set(a) == set(b) 
# True 
+0

Я думаю, что наборы удаляют дубликаты. –

+1

Да, однако, хотя OP только хотел посмотреть, содержат ли массивы 1,2,3 – ODiogoSilva

+1

Если OP действительно хочет самый быстрый способ сделать это, вероятно, лучше всего оставаться в 'numpy' и использовать инструменты, которые он предоставляет, так как они, вероятно, будут наиболее быстрыми для больших массивов numpy. Тем не менее, если OP действительно хочет самого быстрого способа, им очень важно придумать значимые тестовые примеры. – Marius

4

Numpy как совокупность операций набора.

import numpy as np 
import numpy.lib.arraysetops as aso 

a=np.array([2, 1, 3, 3, 3]) 
b=np.array([1, 2, 3, 3, 3]) 

print aso.setdiff1d(a, b) 
+0

Как я могу передать пустой массив в ** True **? – Andy

+1

'x = len (aso.setdiff1d (a, b)) == 0' будет работать. – tom10

+0

Боковой пункт: 'setdiff1d' также доступен в основном пространстве имен NumPy, т. Е.' Np.setdiff1d' (по крайней мере, в последних выпусках библиотеки). –

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