2017-11-02 4 views
-2

Ich habe eine zehnstellige ID für mein Ziel, während ich eine Reihe von IDs für meine potenziellen Paare mit dem Ziel habe. Die ID für die potenziellen Paare ist entweder -1, wenn sie kein Paar sind, oder die Ziel-ID, wenn sie ein Paar sind. Zum BeispielLarge Integer ID entspricht

ID_target = 1234567890 
ID_potential = np.array([-1, -1, 1234567890, -1, -1, 1234567890, -1, 1234567890, -1, -1, -1, -1]) 

Wir können leicht sagen, dass es drei Paare gibt. Wie finde ich jedoch die Paare und gebe den Index der Paare zurück? Ich habe versucht, den folgenden aber nicht:

np.where(ID_potential == ID_target) 

Es sollte folgenden Index zurück:

pair_index = [2,5,7] 

ich nicht ganz auch den obigen Befehl nicht verstehen, die richtige Sache zu tun.

+0

'np.flatnonzero (ID_potential == ID_target)' –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Danke für deinen Kommentar, ich habe diesen Befehl versucht, aber es hat einen Fehler zurückgegeben, der 'AttributeError: 'bool' lautet Objekt hat kein Attribut 'ravel'. –

+0

Huh ... was ist mit 'np.argwhere (ID_potential == ID_target) .ravel()'? –

Antwort

1

Basierend auf @COLDSPEED Kommentar. Geänderte Umwandlung von ID_potential-numpy Array:

>>> np.flatnonzero(np.asarray(ID_potential) == ID_target).tolist() 
[2, 5, 7] 

Einer anderen Version:

>>> np.where(np.equal(ID_potential, ID_target))[0].tolist() 

Wenn dies nicht in Ihrem aktuellen Code nicht funktioniert, dann ist es sehr wahrscheinlich, es ist eine Art Konflikt zwischen ID_potential und ID_target in Ihrem aktuellen Code/Daten oder einige der Daten sind Fließkommazahlen und daher kann strikte Gleichheit nicht gelten. Verwenden Sie in diesem Fall numpy.isclose().

einfach den Code belastbarer zu, Fehler zu machen, versuchen Sie diese Version:

np.where(np.equal(np.asarray(ID_potential, dtype=np.int), np.int(ID_target)))[0].tolist() 

oder, wenn die Werte tatsächlich float sind - ersetzen np.int oben mit np.float und np.equal mit np.isclose():

np.where(np.isclose(np.asarray(ID_potential, dtype=np.float), np.float(ID_target)))[0].tolist() 
+1

@HuanianZhang Welche Version hat für Sie funktioniert? Wo war das eigentliche Problem? –