2016-09-23 2 views
2

Ich weiß, die folgende logische Operation mit numpy funktioniert:Logische Operationen mit Array von Strings in Python

A = np.array([True, False, True]) 
B = np.array([1.0, 2.0, 3.0]) 
C = A*B = array([1.0, 0.0, 3.0]) 

Aber das gleiche gilt nicht, wenn B ein Array von Strings ist. Ist es möglich, Folgendes zu tun:

A = np.array([True, False, True]) 
B = np.array(['eggs', 'milk', 'cheese']) 
C = A*B = array(['eggs', '', 'cheese']) 

Das ist eine Zeichenfolge multipliziert mit False sollte eine leere Zeichenfolge gleich sein. Kann dies ohne eine Schleife in Python gemacht werden (muss nicht numpy sein)?

Danke!

Antwort

5

Sie np.where zur Herstellung einer solchen Auswahl basierend auf einer Maske verwenden -

np.where(A,B,'') 

Probelauf

-

In [4]: A 
Out[4]: array([ True, False, True], dtype=bool) 

In [5]: B 
Out[5]: 
array(['eggs', 'milk', 'cheese'], 
     dtype='|S6') 

In [6]: np.where(A,B,'') 
Out[6]: 
array(['eggs', '', 'cheese'], 
     dtype='|S6') 
2

Da Strings mit ganzen Zahlen multipliziert werden, und booleans ganze Zahlen sind:

A = [True, False, True] 
B = ['eggs', 'milk', 'cheese'] 
C = [a*b for a, b in zip(A, B)] 
# C = ['eggs', '', 'cheese'] 

Ich benutze immer noch eine Art von Schleife (gleiche wie numpy Lösung), aber es ist versteckt ich n prägnantes Listenverständnis.

Alternativ:

C = [a if b else '' for a, b in zip(A, B)] # explicit loop may be clearer than multiply-sequence trick 
+1

„Ich verwende immer noch eine Art von Schleife (die gleiche wie numpy Lösung), aber es wird in kurzer Liste Verständnis versteckt.“ - Im Allgemeinen, wenn Sie mit NumPy arbeiten, möchten Sie, dass Ihre Schleifen in C und nicht in Listenkompressen stattfinden. C-Schleifen vermeiden eine Menge Overhead. Python-Loops sind in der Regel einige Dutzend bis tausend Mal langsamer. – user2357112

+2

@ user2357112 Um ehrlich zu sein, ist es mir nicht klar, ob OP numpy verwendet, weil er wirklich mächtige lineare Algebra-Toolbox braucht oder nur weil es die einzige Art ist, stückweise Operationen zu machen. Das Speichern von Strings in numpigen Arrays ist ziemlich eigenartig, es ist nicht so, als würden Sie eine Matrix-Vektor-Multiplikation damit machen ... Ich habe nur eine Alternative zur Verfügung gestellt, die _nicht numpy_ verwenden muss. Fühlen Sie sich frei zur Abstimmung oder zur Abstimmung. –

2

np.char gilt Zeichenfolge Methoden Elemente eines Arrays:

In [301]: np.char.multiply(B, A.astype(int)) 
Out[301]: 
array(['eggs', '', 'cheese'], 
     dtype='<U6') 

I die Boolesche zu konvertieren hätten, ganze Zahl ist und es dem zweiten Platz.

Timing in anderen Fragen zeigt np.char iteriert und wendet die Python-Methoden an. Die Geschwindigkeit ist ungefähr so ​​wie beim Listenverständnis.

Für Vor-Ort-Änderung, maskierte Zuordnung anstelle von where

In [306]: B[~A]='' 
In [307]: B 
Out[307]: 
array(['eggs', '', 'cheese'], 
     dtype='<U6')