2016-10-12 11 views
1

Ich habe ein numpy Array 'A' der Größe 5000x10. Ich habe auch eine andere Nummer 'Num'. Ich möchte folgendes jede Zeile von A anzuwenden:Finden von Index durch Iterieren über jede Zeile der Matrix

import numpy as np 
np.max(np.where(Num > A[0,:])) 

Gibt es eine pythonic Art und Weise als für über eine for-Schleife zu schreiben.

Antwort

2

könnten Sie verwenden argmax -

A.shape[1] - 1 - (Num > A)[:,::-1].argmax(1) 

Alternativ mit cumsum und argmax -

(Num > A).cumsum(1).argmax(1) 

Erläuterung: Mit np.max(np.where(..), suchen wir im Grunde das letzte Vorkommen der Spiele entlang jeder Reihe zu bekommen auf den Vergleich.

Für das gleiche können wir argmax verwenden. Aber argmax auf einem booleschen Array gibt uns das erste Vorkommen und nicht das letzte. Ein Trick besteht also darin, den Vergleich durchzuführen und die Spalten mit [:,::-1] zu spiegeln und dann argmax zu verwenden. Die Spaltenindizes werden dann durch die Anzahl der Spalten in dem Array subtrahiert, um sie auf die ursprüngliche Reihenfolge zurückzuführen.

Auf dem zweiten Ansatz, es ist sehr ähnlich zu einem related post und deshalb von ihm zitiert:

Eine der Anwendungen von argmax ist ID des ersten Auftretens des maximalen Elements entlang einer Achse in einer Reihe zu bekommen. So erhalten wir die Cumsum entlang der Zeilen und erhalten die erste maximale ID, die das letzte Nicht-Null-Element darstellt. Der Grund dafür ist, dass Cumsum auf den übrig gebliebenen Elementen den Summenwert nach dem letzten Nicht-Null-Element nicht erhöht.

+0

Was bedeutet Folgendes: A [:, :: - 1]? – Zanam

+0

@Zanam Hinzugefügt einige Kommentare dort. – Divakar

+0

Ich mag den "Cumsum" one :) interessanten Ansatz, und wie üblich, ausgezeichnete Erklärung von beiden. –

Verwandte Themen