2016-06-02 5 views
2

Ich habe eine Reihe von Strings 'A' der Länge 100 und sie sind Sätze unterschiedlicher Größe. Es ist Zeichenfolge NICHT numpy Saitenpython finden string-Muster in numpy Reihe von Strings

>>> type(A[0]) 
<type 'str'> 

Ich möchte den Standort von Strings in A, die bestimmte Muster wie ‚zzz‘ in ihnen enthalten finden.

Ich versuchte

np.core.defchararray.find(A, 'zzz') 

gibt Fehler:

TypeError: string operation on non-string array 

Ich nehme an, ich müssen numpy String in einem jeden der 'str' ändern?

Edit:

ich den Index ‚zzz‘ Auftritt in einem

+0

Was tun Sie, wenn Sie sie finden wollen? Teile sie? Holen Sie sich den Index? –

+0

Warum nicht nur '[s.find (Muster) für s in A]' und dann haben Sie den Index des ersten Auftretens dieses Musters in jeder Zeichenfolge (-1, wenn das Muster nicht gefunden wird) – ZWiki

Antwort

5

Keine Notwendigkeit zu finden, will mit dieser Phantasie zu sein, können Sie die Liste der indicies mit einer Liste Verständnis bekommen können und den in Operator :

>>> import numpy as np 
>>> lst = ["aaa","aazzz","zzz"] 
>>> n = np.array(lst) 
>>> [i for i,item in enumerate(n) if "zzz" in item] 
[1, 2] 

Beachten sie, dass hier die Elemente des Arrays sind tatsächlich numpy Strings, aber der in werden von einem Operator auch für normale Strings arbeiten, so ist es strittig.

1

Das Problem hier ist die Art Ihres Arrays von Strings.

Wenn ich machen das Array wie:

In [362]: x=np.array(['one','two','three']) 

In [363]: x 
Out[363]: 
array(['one', 'two', 'three'], 
     dtype='<U5') 

In [364]: type(x[0]) 
Out[364]: numpy.str_ 

Die Elemente der besonderen Art String sind, implizit gepolstert zu 5 Zeichen (die längste ‚np.char Methoden funktionieren auf diese Art von Array

In [365]: np.char.find(x,'one') 
Out[365]: array([ 0, -1, -1]) 

Aber wenn ich ein Objekt Array machen, die Strings enthält, wird es Ihre Fehler

In [366]: y=np.array(['one','two','three'],dtype=object) 

In [367]: y 
Out[367]: array(['one', 'two', 'three'], dtype=object) 

In [368]: type(y[0]) 
Out[368]: str 

In [369]: np.char.find(y,'one') 
... 
/usr/lib/python3/dist-packages/numpy/core/defchararray.py in find(a, sub, start, end) 
... 
TypeError: string operation on non-string array 

A Und oft muss ein Objekt-Array als Liste behandelt werden.

In [370]: y 
Out[370]: array(['one', 'two', 'three'], dtype=object) 

In [371]: [i.find('one') for i in y] 
Out[371]: [0, -1, -1] 

In [372]: np.array([i.find('one') for i in y]) 
Out[372]: array([ 0, -1, -1]) 

Die np.char Methoden sind praktisch, aber sie sind nicht schneller. Sie müssen immer noch durch das Array iterieren, indem sie auf jedes Element reguläre Zeichenfolgenoperationen anwenden.

1

können Sie versuchen, dieses:

np.core.defchararray.find(A.astype(str), 'zzz') 
Verwandte Themen