Gibt es eine Möglichkeit, eine Python-Liste wie x = ['a','b','c']
mit einem numpy boolean Array zu indizieren? Ich erhalte derzeit den folgenden Fehler: TypeError: only integer arrays with one element can be converted to an index
Index Python-Liste mit Numpy Boolean Array
Antwort
Indizierung über []
ruft heimlich die __getitem__
Methode des Objekts auf. Für Objekte, die in reinem Python implementiert sind, können Sie diese Methode einfach mit einer Funktion überschreiben, die Ihren Anforderungen entspricht. Listen sind jedoch in C implementiert, so dass es nicht erlaubt ist, list.__getitem__
zu ersetzen. Daher gibt es keinen direkten Weg, um das zu tun, was Sie wünschen.
Sie können jedoch eine NumPy Array machen aus Ihrer Liste und tun dann NumPy Stil boolean Indizierung auf, dass:
import numpy as np
x = ['a', 'b', 'c']
mask = np.array([True, False, True])
x_arr = np.asarray(x, dtype=object)
output = x_arr[mask] # Get items
x_arr[mask] = ['new', 'values'] # Set items
Leider np.asarray
kann nicht einfach einen Blick auf Ihrer Liste machen, so dass die Liste ist einfach kopiert. Dies bedeutet, dass das Original x
unverändert bleibt, wenn den Elementen von x_arr
neue Werte zugewiesen werden.
Wenn Sie wirklich die volle Leistung von NumPy booleschen Indizierung auf Listen wollen, müssen Sie eine Funktion schreiben, die dies von Grund auf neu, und Sie können nicht die []
Indexierungssyntax verwenden.
In [304]: ['a','b','c'][[2,1,0]]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-304-c04b1f0621a3> in <module>()
----> 1 ['a','b','c'][[2,1,0]]
TypeError: list indices must be integers or slices, not list
Liste Verständnis Route
In [306]: [i for i,j in zip(['a','b','c'],[True, False, True]) if j]
Out[306]: ['a', 'c']
Array Route zur Liste
In [308]: np.array(['a','b','c'])[np.array([True, False, True])]
Out[308]:
array(['a', 'c'],
dtype='<U1')
zurück:
In [309]: np.array(['a','b','c'])[np.array([True, False, True])].tolist()
Out[309]: ['a', 'c']
aber vorsichtig sein, wenn Sie Ihre Liste Objekte enthält, wie Zahlen gegen oder Zeichenfolgen. Dadurch werden die Verknüpfungen möglicherweise nicht beibehalten.
Das operator
Modul hat eine itemgetter
Funktion
In [321]: operator.itemgetter(*[2,0,1])(list('abc'))
Out[321]: ('c', 'a', 'b')
Aber unter der Decke ist es nur eine Liste Verständnis wie Iterator. Und ich sehe nicht ohne weiteres eine boolesche Version.
map(x.__getitem__,np.where(mask)[0])
Oder wenn Sie möchten Liste Verständnis
[x[i] for i in np.where(mask)[0]]
Dies hält Sie über die ganze Liste zu durchlaufen hat, vor allem, wenn mask
spärlich ist.
Benötigen Sie es, um eine Liste zu sein. Da Sie das Indizierungsverhalten eines numpy Arrays verwenden möchten, wäre es für andere Leute, die Ihren Code lesen, sinnvoller, wenn Sie tatsächlich ein numpy Array verwenden.
Vielleicht versuchen, ein Array mit dtype = 'a' zu verwenden?Zum Beispiel in dem folgenden Code,
x = sp.array(['a', 'b', 'c'], dtype='a')
print(x)
print(x=='c')
print(x[x=='c']).
Dies wird die folgende Arrays zurückgeben,
['a' 'b' 'c']
[False False True]
['c'].
Zuordnung funktioniert, wie Sie erwarten,
x[x=='c'] = 'z'
print(x).
Dies wird die modifizierte Array zurück ,
['a' 'b' 'z'].
Die einzige Sorge ist, dass die Elemente des Arrays nicht länger als die zugewiesene Länge sein können. Hier wird es als eine mit dtype = 'a' angegeben. Sie können dtype = 'a5' oder dtype = 'aN' für jede gewünschte Länge verwenden. Alle Elemente des Arrays müssen Zeichenfolgen sein, die kürzer als die maximale Länge sind.
Wenn Sie übergeben eine Zeichenfolge, die zu lang ist, wird es das Ende abhacken, wie im folgenden Beispiel mit dtype Satz ‚a2‘:
x = sp.array(['abc', 'bcd', 'cde'], dtype='a2')
print(x),
die gibt,
['ab' 'bc' 'cd'].
- 1. Index numpy Array mit pd.Series von boolean
- 2. NumPy Boolean Array Warnung?
- 3. Wie Index numpy Array?
- 4. Pandas boolean Index mit NaN
- 5. Numpy Tutorial - Boolean Indizierung
- 6. numpy boolean Indexierung Verwirrung
- 7. Visible deprecation Warnung auf numpy Array boolean Betrieb mit
- 8. mehr Werte eines numpy Array-Index
- 9. Index mehrdimensionales Array mit Index-Array
- 10. Numpy Convert String Darstellung der Booleschen Array auf Boolean Array
- 11. Extrahieren von 1D-Arrays aus 3D numpy Array 2d boolean
- 12. Numpy: Matrix Array Shift/Einfügen von Index
- 13. Cumulative Summation einer numpy Array von Index
- 14. Index der Mitte eines numpy Array?
- 15. 2D-Numpy-Array nach Index zerlegen
- 16. FutureWarning: in Zukunft wird boolean-Array-likes als boolean-Array-Index behandelt werden
- 17. Wie eine Boolean-Matrix in numpy dump?
- 18. Beschleunigen Sie erhalten Kantenmatrix nach Index mit numpy Array
- 19. Erste bestimmten Index des aus dem Array mit numpy
- 20. Numpy: Array basierend auf Index-Array neu anordnen
- 21. 2-d-Array numpy array Zeilenspalte Index Vergleich
- 22. SetItemChecked (Index, boolean) VS SetItemCheckState (Index, Prüfstatus)
- 23. Mit numpy Index für Termine in matplotlib
- 24. Pythonische Array Indizierung mit Boolean Maskierung Array
- 25. Wählen Sie Zeilen in einer Numpy 2D-Array mit einem boolean Vektor
- 26. Numpy Masking mit Array
- 27. Python-Array mit numpy
- 28. Tensorboard mit numpy Array
- 29. Objekte Array mit numpy
- 30. Numpy-Array mit Cython
In Im Gegensatz zu Arrays können Listen nur mit Skalaren und Slices indiziert werden. Sie müssen etwas wie ein Listenverständnis verwenden, z. [i für i, j in zip (x, Maske) wenn j] '. – hpaulj
@Appolo, können Sie Ihren Code dort anzeigen, wo Sie die Indizierung versuchen? – RomanPerekhrest
@hpaulj was ist, wenn ich 'x [list (mynumpyarr)]' – Apollo