Frage

Wer jemals für dieses Problem kommen? Angenommen, Sie haben zwei Arrays wie folgt aus

a = array([1,2,3,4,5,6])
b = array([1,4,5])

Gibt es eine Möglichkeit, welche Elemente in einem exist in b zu vergleichen? Zum Beispiel:

c = a == b # Wishful example here
print c
array([1,4,5])
# Or even better
array([True, False, False, True, True, False])

Ich versuche, Schleifen zu vermeiden, wenn es altert mit Millionen von Elementen nehmen würde. Irgendwelche Ideen?

Prost

War es hilfreich?

Lösung

Eigentlich gibt es eine noch einfachere Lösung als alle diese:

import numpy as np

a = array([1,2,3,4,5,6])
b = array([1,4,5])

c = np.in1d(a,b)

Die resultierende c ist dann:

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

Andere Tipps

Mit np.intersect1d.

#!/usr/bin/env python
import numpy as np
a = np.array([1,2,3,4,5,6])
b = np.array([1,4,5])
c=np.intersect1d(a,b)
print(c)
# [1 4 5]

Beachten Sie, dass np.intersect1d die falsche Antwort gibt, wenn a oder b nonunique Elemente haben. In diesem Fall Gebrauch np.intersect1d_nu.

Es ist auch np.setdiff1d, setxor1d, setmember1d und union1d. Sehen Numpy Beispiel -Liste Mit Doc

Vielen Dank für Ihre Antwort kaizer.se. Es ist nicht ganz das, was ich suchte, aber mit einem Vorschlag von einem Freund und dem, was Sie sagten, ich kam mit dem Follow-up.

import numpy as np

a = np.array([1,4,5]).astype(np.float32)
b = np.arange(10).astype(np.float32)

# Assigning matching values from a in b as np.nan
b[b.searchsorted(a)] = np.nan

# Now generating Boolean arrays
match = np.isnan(b)
nonmatch = match == False

Es ist ein bisschen ein mühsamer Prozess, aber es schlägt Schleifen oder mit Webart mit Schleifen zu schreiben.

Prost

Numpy hat eine Set-Funktion numpy.setmember1d (), die auf sortierten und uniqued Arrays arbeitet und liefert genau die boolean-Array, das Sie wollen. Wenn die Eingabefelder Sie nicht den Kriterien entsprechen, müssen auf dem eingestellten Format und invertieren die Transformation auf das Ergebnis konvertieren.

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

# convert to the uniqued form
a_set, a_inv = np.unique1d(a, return_inverse=True)
b_set = np.unique1d(b)
# calculate matching elements
matches = np.setmea_set, b_set)
# invert the transformation
result = matches[a_inv]
print(result)
# [False  True False False  True  True False]

Edit: Leider ist das setmember1d Verfahren in numpy wirklich ineffizient. Die Suche sortiert und assign Methode funktioniert schneller vorgeschlagen, aber wenn man direkt zuordnen können Sie könnte genauso gut direkt auf das Ergebnis zuordnen und viele unnötige Kopieren vermeiden. Auch Ihre Methode schlägt fehl, wenn b enthält alles, was nicht in ein. Die folgende korrigiert diese Fehler:

result = np.zeros(a.shape, dtype=np.bool)
idxs = a.searchsorted(b)
idxs = idxs[np.where(idxs < a.shape[0])] # Filter out out of range values
idxs = idxs[np.where(a[idxs] == b)] # Filter out where there isn't an actual match
result[idxs] = True
print(result)

Meine Benchmarks zeigen dies bei 91us vs. 6,6 ms für Ihren Ansatz und 109ms für numpy setmember1d auf 1M Element a und 100 b Element.

ebresset, Ihre Antwort wird nicht funktionieren, es sei denn, a ist eine Teilmenge von B (und a und b sind sortiert). Andernfalls wird die searchsorted falsche Indizes zurück. Ich hatte etwas ähnliches zu tun, und die Kombination, dass mit Ihrem Code:

# Assume a and b are sorted
idxs = numpy.mod(b.searchsorted(a),len(b))
idxs = idxs[b[idxs]==a]
b[idxs] = numpy.nan
match = numpy.isnan(b)

Ihr Beispiel impliziert gesetzt artiges Verhalten, mehr über existance im Array Pflege als das richtige Element an der richtigen Stelle ist. Numpy tut dies anders mit seinem mathematischen Arrays und Matrizen, wird es Ihr nur über Elemente genau an der richtigen Stelle sagen. Können Sie diese Arbeit für Sie?

>>> import numpy
>>> a = numpy.array([1,2,3])
>>> b = numpy.array([1,3,3])
>>> a == b
array([ True, False,  True], dtype=bool)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top