2016-03-07 20 views
12

per trovare il valore massimo in una matrice di numeri, siamo in grado di codificare 5 linee per risolvere il problema:Esiste un codice a una riga per trovare il valore massimo in una matrice?

ans = matrix[0][0] 
for x in range(len(matrix)): 
    for y in range(len(matrix[0])): 
     ans = max(ans, matrix[x][y]) 
return ans 

C'è una soluzione di una riga per questo problema? Quello che mi è venuta è piuttosto scomoda realtà:

return max(max(matrix, key=max)) 

o

return max(map(max, matrix)) 
+0

Perché 'key = max' per la funzione' max'? Non ha senso. Altrimenti, funziona, quindi hai già risposto alla tua domanda. Puoi anche usare numpy, se hai intenzione di farlo spesso o con grandi matrici. – Evert

+0

@Evert 'key = max' nella funzione' max' è perché per ogni riga, si utilizza il massimo di quella riga da confrontare. – 8090PZ

+1

Ricorda che mettere molta logica in una singola riga è un ottimo modo per rendere il tuo codice illeggibile difficile da mantenere. –

risposta

14

È possibile utilizzare generator expression per trovare il massimo nella tua matrice. In questo modo puoi evitare di costruire l'elenco completo degli elementi di matrice in memoria.

maximum = max(max(row) for row in matrix) 

invece di lista come indicato in una precedente risposta here

maximum = max([max(row) for row in matrix]) 

Questo da PEP (sezione rationale):

... molti dei casi d'uso fare non è necessario avere una lista completa creata nella memoria . Invece, devono solo scorrere gli elementi uno a un'ora .

...

espressioni Generator sono particolarmente utili con funzioni come sum(), min(), e Max() che riducono un ingresso iterabile a un singolo valore

...

L'utilità delle espressioni del generatore è notevolmente migliorata se combinata con funzioni di riduzione come sum(), min() e max().

Inoltre, dai un'occhiata a questo post SO: Generator Expressions vs. List Comprehension.

8

da Matrix, suppongo si intende un 2d-list.

max([max(i) for i in matrix]) 
+21

Non hai davvero bisogno di creare una lista intermedia, per es .: 'max (max (i) per i in matrix)' - un'espressione di generatore è abbastanza buona. – AChampion

+0

In questo caso è meglio utilizzare l'espressione del generatore, come già menzionato @ AChampion.Date un'occhiata [qui] (https://www.python.org/dev/peps/pep-0289/), e [qui] (https://www.python.org/dev/peps/pep-0289/ # funzioni di riduzione) –

5

utilizzando numpy.amax:

import numpy as np 
>>> my_array 
array([[1, 2, 3], 
     [9, 8, 6]]) 
>>> np.amax(my_array) 
9 
+0

Il punto della domanda è che l'OP non ha i dati all'interno di una matrice numpy. Se si intende rispondere utilizzando una soluzione numpy, è necessario aggiungere anche il codice per eseguire la conversione dall'elenco Python degli elenchi all'array numpy. – Bakuriu

+0

@Bakuriu In realtà, sebbene questa risposta nella sua forma attuale non lo mostri, Numpy opererà anche su un elenco di liste come se fosse un 'array', se tutte le sottoliste hanno la stessa lunghezza. (Presumibilmente questo è il caso perché l'OP si riferiva ad esso come una matrice.) Detto questo, se non hai ancora un motivo per usare Numpy, è una grande dipendenza che probabilmente non vale la pena di inserire solo per questo funzione. –

5

È inoltre possibile appiattire la matrice:

from itertools import chain 

flatten = chain.from_iterable 

max(flatten(matrix))