Per un grande insieme di punti distribuiti casualmente in un reticolo 2D, voglio estrarre in modo efficiente un subarray, che contiene solo gli elementi che, approssimati come indici, sono assegnati a non- valori zero in una matrice binaria 2D separata. Attualmente, il mio script è il seguente:Manipolazione di array veloce basata sull'inclusione di elementi nella matrice binaria
lat_len = 100 # lattice length
input = np.random.random(size=(1000,2)) * lat_len
binary_matrix = np.random.choice(2, lat_len * lat_len).reshape(lat_len, -1)
def landed(input):
output = []
input_as_indices = np.floor(input)
for i in range(len(input)):
if binary_matrix[input_as_indices[i,0], input_as_indices[i,1]] == 1:
output.append(input[i])
output = np.asarray(output)
return output
Tuttavia, ho il sospetto che ci sia un modo migliore per farlo. Lo script precedente può richiedere un tempo piuttosto lungo per eseguire 10000 iterazioni.
Incredibile. Puoi spiegare quali modifiche hanno apportato la maggiore differenza in termini di prestazioni, ad esempio l'uso di int? –
La differenza di prestazioni è dovuta al fatto che evitiamo il ciclo for in python e utilizziamo invece l'indicizzazione numpy avanzata (ho aggiunto un link sopra) che è codificato in modo più efficiente in C. La conversione in interi è solo un effetto collaterale, poiché gli indici non possono avere un 'dtype' float e devono essere interi o booleani. – rth