2015-06-09 11 views
7

Sto avendo un numpy ndarray in cui vorrei controllare se il vettore di ogni riga è monotonicamente crescente.Controlla in modo efficiente se i valori di ndarray sono numpy strettamente crescenti

Esempio:

a = np.asarray([[1,2,3],[1,5,7],[4,3,6]]) 
monotonically_increasing(a) 

Rendimento atteso:

[True, True, False] 

Non sono del tutto sicuro di come fare in modo efficiente questo, dal momento che le matrici dovrebbero essere abbastanza grande (~ 1000x1000), e speravo in qualche aiuto.

risposta

13
>>> import numpy as np 
>>> a = np.asarray([[1,2,3],[1,5,7],[4,3,6]]) 

Trova la differenza tra ogni elemento. np.diff ha un argomento che permette di specificare l'asse effettuare il diff

>>> np.diff(a) 
array([[ 1, 1], 
     [ 4, 2], 
     [-1, 3]]) 

Verificare se ogni differenza è maggiore di 0.

>>> np.diff(a) > 0 
array([[ True, True], 
     [ True, True], 
     [False, True]], dtype=bool) 

Verificare se tutte le differenze sono> 0

>>> np.all(np.diff(a) > 0) 
False 
>>> 

Come suggeriscono cati da @Jaime - controllare che ogni elemento è maggiore l'elemento alla sua sinistra:

np.all(a[:, 1:] >= a[:, :-1], axis=1) 

che sembra essere circa due volte più veloce/efficiente come la mia soluzione diff.

+5

Probabilmente è più veloce confrontare ogni elemento con quello adiacente direttamente, piuttosto che confrontare se la loro differenza è maggiore di zero: 'np.all (a [:, 1:]> = a [:,: -1], asse = 1) ' – Jaime

+0

Concur. Nel peggiore dei casi il tuo fa un passaggio e il mio fa un passaggio per il diff e un * più corto * per '' 'np.all'''. – wwii

+0

Ottima risposta, grazie! –

2

si può fare una funzione come questa:

def monotonically_increasing(l): 
    return all(x < y for x, y in zip(l, l[1:])) 

e quindi controllare per esso, sottolista per sottolista, così

[monotonically_increasing(sublist) for sublist in a] 
+0

Anche questo funziona, grazie! –

Problemi correlati