2016-02-06 11 views
5

Mam dwie 1-d tablice (a i b) zawierające ciągi, które chcę porównać element mądry, aby uzyskać wyjście jak pokazano poniżej. Próbowałem go przekonwertować, aby ustawić i porównać, ale to nie daje właściwego rozwiązania. Również parametr logiczny_xor nie działa dla łańcucha znaków. Mogę napisać pętlę, aby to zrobić, ale potem to pokonuje cel korzystania z tablic, Jaki może być najlepszy sposób na zrobienie tego bez pętli?Porównywanie łańcucha 1-d numpy array elementwise

>> a 
     array(['S', 'S', 'D', 'S', 'N', 'S', 'A', 'S', 'M'], 
      dtype='|S1') 
    >> b 
     array(['T', 'I', 'D', 'N', 'G', 'B', 'A', 'J', 'M'], 
      dtype='|S1') 

    >> c 
    array([False, False, True, False, False, False, True, False, True], 
     dtype=bool) 

Odpowiedz

3

Wystarczy użyć metody __eq__ w ndarray za, tj ==

>>> a = array(['S', 'S', 'D', 'S', 'N', 'S', 'A', 'S', 'M'], dtype='|S1') 
>>> b = array(['T', 'I', 'D', 'N', 'G', 'B', 'A', 'J', 'M'], dtype='|S1') 
>>> a == b 
array([False, False, True, False, False, False, True, False, True], dtype=bool) 
+0

Aah! brakowało najprostszej opcji ... Dziękuję :) –

0

Można użyć numpy.equal:

import numpy as np 
c = np.equal(a,b) 

Albo numpy.core.defchararray.equal:

c = np.core.defchararray.equal(a, b) 

EDIT

np.equal został deprecated in the last numpy's releases a teraz podnosi FutureWarning:

>>> c = np.equal(a,b) 
__main__:1: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison 
>>> c 
NotImplemented 

Równość operator == będzie ten sam los jak np.equal. Sugeruję więc użycie:

c = np.array([a == b], dtype=bool) 
+0

To nie działa. Otrzymujesz błąd: '' 'FutureWarning: porównanie elementów nie powiodło się; powracający skalar zamiast tego, ale w przyszłości będzie wykonywał porównanie elementarne NotImplemented''' – luxon

+0

Ok to jest wycofanie numpy (zobacz [te rzeczy] (https://docs.scipy.org/doc/numpy/release.html# id50)). Edytuję swoją odpowiedź :) – cromod