moyen le plus rapide d'obtenir des éléments distincts à partir d'une matrice/listeJ'essaie d'obtenir les éléments distincts dans un vecteur assez grand et je me demandais si quelqu'un connaissait un moyen plus rapide que de créer un tableau associatif. J'ai essayé ce qui suit.
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));
Ce qui a donné un résultat de :
opt1 = 1082 ;
opt2 = 40914 ;
opt3 = 5853 ;
opt4 = 8001 ;
N éléments (distinct1) = 211 ;
N éléments (distinct2) = 211 ;
N lignes (distinct3`) = 211 ;
N éléments (distinct4) = 211 ;
*Modifier* D'accord, N'utilisez certainement PAS de tableau associatif car il n'autorise pas les clés à virgule flottante, il arrondit tout. La boucle for semble assez lente pour cette opération, donc quelqu'un a-t-il quelque chose de mieux ?
Re : moyen le plus rapide d'obtenir des éléments distincts à partir d'une matrice/listeJe ne sais pas comment cela se compare en termes de vitesse, mais c'est plus rapide à taper...
distinct = Design(times, <<LEVELS></LEVELS>
Re : moyen le plus rapide d'obtenir des éléments distincts à partir d'une matrice/listePour la plupart de mes sets que j'ai testés. La mise à l'échelle par 2 ^ 52 semble être la plus rapide (avec une perte acceptable). Merci pour tous les commentaires.
Re : moyen le plus rapide d'obtenir des éléments distincts à partir d'une matrice/listeBelle utilisation du résumé.
La meilleure solution peut être différente pour des problèmes de différentes tailles ; une surcharge de configuration importante pourrait s'avérer payante sur un problème suffisamment important.
J'étudiais comment transformer des nombres à virgule flottante en clés pour des tableaux associatifs et je n'ai trouvé que des réponses plus lentes impliquant des chaînes créées à partir des nombres.
Vous pouvez mettre à l'échelle les nombres à virgule flottante en nombres entiers compris entre +/- 2 ^ 52 et utiliser les nombres entiers pour indexer des tableaux associatifs. Oui, 2 ^ 52 et non 2 ^ 32 et non 2 ^ 64. Les nombres à virgule flottante à double précision de 8 octets utilisés par JMP ont une fraction de 52 bits. Wikipédia . Ce serait une conversion avec perte mais pourrait conserver la plupart des informations.
Re : moyen le plus rapide d'obtenir des éléments distincts à partir d'une matrice/listeVoici une autre alternative que vous voudrez peut-être essayer
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;
Re : moyen le plus rapide d'obtenir des éléments distincts à partir d'une matrice/listeJ'ai fait la même chose en utilisant un tableau associatif. Comme vous le remarquez, pour gérer des nombres inférieurs à zéro/avec de nombreuses décimales, vous devez d'abord prélever un échantillon des données, découvrir quel serait un bon facteur d'échelle, puis mettre à l'échelle les éléments du vecteur.
Cela semble toujours fonctionner plus rapidement que l'utilisation d'une boucle for puisqu'il s'agit d'un peu de manipulation matricielle suivie de la création du tableau associatif.