In Anbetracht der folgenden Matrix:

In [0]: a = np.array([[1,2,9,4,2,5],[4,5,1,4,2,4],[2,3,6,7,8,9],[5,6,7,4,3,6]])
Out[0]: 
array([[1, 2, 9, 4, 2, 5],
       [4, 5, 1, 4, 2, 4],
       [2, 3, 6, 7, 8, 9],
       [5, 6, 7, 4, 3, 6]])

Ich möchte die Indizes der Zeilen erhalten, die 9 als Mitglied haben. Das ist,

idx = [0,2]

Zur Zeit mache ich das,

def myf(x):
    if any(x==9):
        return True
    else:
        return False

aux = np.apply_along_axis(myf, axis=1, arr=a)
idx = np.where(aux)[0]

Und ich bekomme das gewünschte Ergebnis.

In [1]: idx
Out[1]: array([0, 2], dtype=int64)

Aber diese Methode ist sehr langsam (was bedeutet, dass es vielleicht einen schnelleren Weg gibt) und sicherlich nicht sehr pythonisch .

Wie kann ich dies auf eine sauberere, pythonischere aber hauptsächlich effizientere Weise tun?

Beachten Sie, dass diese Frage in der Nähe von diese, aber hier möchte ich die Bedingung auf die gesamte Zeile anwenden.

0
myradio 23 Feb. 2020 im 23:55

3 Antworten

Beste Antwort

Sie können np.argwhere und np.any kombinieren:

np.argwhere(np.any(a==9,axis=1))[:,0]
1
Alain T. 23 Feb. 2020 im 21:11

Sie können versuchen, np.nonzero und unique

Überprüfen Sie 9

np.unique((a == 9).nonzero()[0])

Out[356]: array([0, 2], dtype=int64)

Überprüfen Sie 6

np.unique((a == 6).nonzero()[0])

Out[358]: array([2, 3], dtype=int64)

Überprüfen Sie 8

np.unique((a == 8).nonzero()[0])

Out[359]: array([2], dtype=int64)

Bei nicht vorhandener Nummer leere Liste zurückgeben

np.unique((a == 88).nonzero()[0])

Out[360]: array([], dtype=int64)
0
Andy L. 24 Feb. 2020 im 10:58

Verwenden Sie np.argwhere, um die Indizes zu finden, bei denen a==9, und verwenden Sie die 0. Spalte dieser Indizes, um a zu indizieren:

In [171]: a = np.array([[1,2,9,4,2,5],[4,5,1,4,2,4],[2,3,6,7,8,9],[5,6,7,4,3,6]])
     ...: 
     ...: indices = np.argwhere(a==9)
     ...: a[indices[:,0]]
Out[171]: 
array([[1, 2, 9, 4, 2, 5],
       [2, 3, 6, 7, 8, 9]])

... oder wenn Sie nur die Zeilennummern benötigen, speichern Sie einfach indices[:,0]. Wenn 9 mehr als einmal pro Zeile angezeigt werden kann und keine doppelten Zeilen aufgelistet werden sollen, können Sie Ihr Ergebnis mit np.unique filtern (in diesem Beispiel nichts):

In [173]: rows = indices[:,0]

In [174]: np.unique(rows)
Out[174]: array([0, 2])
1
salt-die 23 Feb. 2020 im 21:01