Ho un array di x, y, z coordinate diversi (~ 10^10) punti (solo 5 illustrati)Accelerazione distanza tra tutte le possibili coppie in una matrice
a= [[ 34.45 14.13 2.17]
[ 32.38 24.43 23.12]
[ 33.19 3.28 39.02]
[ 36.34 27.17 31.61]
[ 37.81 29.17 29.94]]
voglio fare una nuova matrice con solo quei punti che sono almeno una certa distanza d
lontano da tutti gli altri punti nella lista. Ho scritto un codice utilizzando while
ciclo,
import numpy as np
from scipy.spatial import distance
d=0.1 #or some distance
i=0
selected_points=[]
while i < len(a):
interdist=[]
j=i+1
while j<len(a):
interdist.append(distance.euclidean(a[i],a[j]))
j+=1
if all(dis >= d for dis in interdist):
np.array(selected_points.append(a[i]))
i+=1
Questo funziona, ma sta prendendo molto lungo per eseguire questo calcolo. Ho letto da qualche parte che i loop while
sono molto lenti.
Mi chiedevo se qualcuno ha qualche suggerimento su come velocizzare questo calcolo.
EDIT: Mentre il mio obiettivo di trovare le particelle che sono almeno una certa distanza da tutti gli altri rimane la stessa, ho capito che c'è un grave difetto nel mio codice, diciamo che ho 3 particelle, il mio codice fa quanto segue, per la prima iterazione di , calcola le distanze 1->2
, 1->3
, diciamo che 1->2
è inferiore alla distanza di soglia d
, quindi il codice getta via la particella 1
. Per la successiva iterazione di i
, fa solo 2->3
, e diciamo che trova che è maggiore di d
, quindi mantiene la particella 2
, ma questo è sbagliato! dal 2 dovrebbe anche essere scartato con la particella 1
. La soluzione di @svohara è quella giusta!
Quanto tempo ci vuole? – Rockybilly
Mi sono imbattuto durante la notte ~ 7 ore ed è ancora in esecuzione. – HuShu
Come suggerimento rapido, non è possibile continuare il calcolo delle distanze se uno è più grande di 'd'. Ridurrà un'altra corsa attraverso l'array nella clausola 'all (dis> = d per dis in interdist)' – max