modo più veloce per ottenere elementi distinti da una matrice/listaSto cercando di ottenere gli elementi distinti in un vettore abbastanza grande e mi chiedevo se qualcuno conoscesse un modo più veloce rispetto alla creazione di un array associativo. Ho provato quanto segue.
Names Default to here(1);
dt = open("$SAMPLE_DATA\Probe.jmp");
rows = dt << Get rows Where(Num(:Wafer Number) <= 10);
times = Column(dt, "Start Time")[rows];
//option 1
st = HPTime();
distinct1 = associative array(as list(times));
distinct1 = distinct1 << Get Keys;
opt1 = HPTime()-st;
show(opt1);
//option 2
st = HPTime();
dt_sub = dt << Subset(
Selected Rows( 0 ),
Rows( rows ),
Selected columns only( 0 )
);
Summarize(dt_sub, distinct2 = by(:Start Time));
close(dt_sub, no save);
opt2 = HPTime()-st;
show(opt2);
//option 3
st = HPTime();
distinct3 = [];
for(i=1, i<=nrows(times), i++,
if(!any(distinct3 == times[i]),
distinct3 ||= times[i]
)
);
opt3 = HPTime()-st;
show(opt3);
//option 4
st = HPTime();
distinct4 = {};
for(i=1, i<=nrows(times), i++,
if(!Contains(distinct4, times[i]),
insert into(distinct4, times[i])
)
);
opt4 = HPTime()-st;
show(opt4);
show(nitems(distinct1), nitems(distinct2), nrows(distinct3`), nitems(distinct4));
Che ha dato un output di:
opt1 = 1082;
opt2 = 40914;
opt3 = 5853;
opt4 = 8001;
N elementi(distinct1) = 211;
N elementi(distinct2) = 211;
N Righe(distinct3`) = 211;
N elementi(distinct4) = 211;
*Modifica* Ok, assolutamente NON usare l'array associativo perché non consente chiavi in virgola mobile, arrotonda tutto. Il ciclo for sembra piuttosto lento per questa operazione, quindi qualcuno ha qualcosa di meglio?
Ri: modo più veloce per ottenere elementi distinti da una matrice/elencoNon sono sicuro di come si confronti in termini di velocità, ma è più veloce da digitare ...
distinct = Design(times, <<LEVELS></LEVELS>
Ri: modo più veloce per ottenere elementi distinti da una matrice/elencoPer la maggior parte dei miei set che ho testato. Il ridimensionamento di 2 ^ 52 sembra essere il più veloce (con una perdita accettabile). Grazie per tutti i feedback.
Ri: modo più veloce per ottenere elementi distinti da una matrice/elencoBuon uso del sommario.
La soluzione migliore può essere diversa per problemi di dimensioni diverse; un grande sovraccarico di configurazione potrebbe ripagare un problema abbastanza grande.
Stavo studiando come trasformare i numeri in virgola mobile in chiavi per array associativi e ho trovato solo risposte più lente che coinvolgono stringhe create dai numeri.
È possibile ridimensionare i numeri in virgola mobile in numeri interi tra +/- 2^52 e utilizzare i numeri interi per indicizzare gli array associativi. Sì, 2^52 non 2^32 e non 2^64. I numeri in virgola mobile a doppia precisione a 8 byte utilizzati da JMP hanno una frazione di 52 bit wikipedia . Questa sarebbe una conversione con perdita, ma potrebbe mantenere la maggior parte delle informazioni.
Ri: modo più veloce per ottenere elementi distinti da una matrice/elencoEcco un'altra alternativa che potresti voler provare
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\Probe.jmp" );
dt << Select Where( Num( :Wafer Number ) > 10 );
dt << exclude;
dtSumm = dt << Summary(
private,
Group( :Start Time ),
Freq( "None" ),
Weight( "None" ),
statistics column name format( "column" ),
Link to original data table( 0 )
);
dtSumm << delete rows;
Distinct = dtSumm:Start Time << get values;
Close( dtSumm, nosave );
dt << clear row states;
Ri: modo più veloce per ottenere elementi distinti da una matrice/elencoHo fatto lo stesso usando un array associativo. Come si nota, per gestire numeri inferiori a zero/con molte cifre decimali è necessario prima prelevare un campione dei dati, scoprire quale sarebbe un buon fattore di scala e quindi ridimensionare gli elementi del vettore.
Sembra che funzioni ancora più velocemente rispetto all'utilizzo di un ciclo for poiché è un po 'di manipolazione della matrice seguita dalla creazione dell'array associativo.