Come convertire un elenco numerico in uno di caratteri?Ciao a tutti,
Ho una lista contenente numeri e vorrei trasformarli in caratteri. C'è un modo per farlo senza usare un loop? Non sono riuscito a trovare la funzione corretta.
Grazie per l'aiuto!
Miscelazione e pulizia dei datiRe: Come convertire una lista numerica in una di caratteri?@DonMcCormack Il ciclo for vanilla è sia il più veloce che il più lento, a seconda delle dimensioni del problema. Io sono Veramente sorpreso @SM la soluzione basata sulle parole funziona così bene su grandi dimensioni. Mi piacciono molto le risposte inaspettate che mostrano una funzionalità di JMP come questa. Sono un po 'sorpreso perché ognuno è più veloce di per, a una certa dimensione. Anche a me piace saperlo.
Non cercherei di evitare nulla. Mi piace il tuo attuale piano per una discussione, piuttosto che un chiaro vincitore. Ecco alcune idee per avviare una discussione:
- Se avessi N liste da convertire e tutte avessero M elementi, in che modo N e M influenzano il codice che scriveresti? Considera non solo la velocità, ma anche la correttezza e la facilità di manutenzione.
- Quali idee sembrano migliori per le macchine con limiti di memoria?
- Come mostreresti "NaN" invece di "."?
- Come sarebbe una routine generica? Come lo chiameresti se fosse integrato in JMP?
Re: Come convertire una lista numerica in una di caratteri?C'è anche Transform Each, che qui sembra essere un po' più veloce di For Each.
theList = Transform Each( {value}, theList, Char( value ) );
Re: Come convertire una lista numerica in una di caratteri?Grazie @Craige_Hales ! Mi piace. Fammi vedere se riesco a inserirlo nella prossima sfida. Dovremmo cercare di evitare qualsiasi iterazione o semplicemente Per (e suoi derivati)?Un modo per evitare l'iterazione è attraverso la valutazione dell'espressione. Se non hai familiarità con questo approccio, dai un'occhiata @Joseph Morgan 'S Tutorial sulla scoperta, punto 1 . Per il problema precedente, la funzione potrebbe essere simile a questa:
convertNumberToCharacter = Function({inList},{i=1,outList={}},
outList[1::N Items(inList)] = Expr(Char(inList[i++]));
Eval List(outList);
);
/* You can check it out using the code below.
tStart = HP Time();
alist = As List(J(10000,1,Random Normal(1e6,1e5)));
newList = convertNumberToCharacter(alist);
Print((HP Time()-tStart)/1e6);
*/
L'ho provato in alcune delle sfide e, sebbene succinto, tende a richiedere più tempo ed è più difficile da capire (a meno che tu non abbia abbastanza familiarità con la gestione delle espressioni).
Re: Come convertire una lista numerica in una di caratteri?@DonMcCormack - Sfida !
Re: Come convertire una lista numerica in una di caratteri?Wow, stavo cercando una soluzione e ne ho avute così tante! JMP è incredibile! Grazie a tutti voi!
Re: Come convertire una lista numerica in una di caratteri?Bella illustrazione delle prestazioni dipendenti dalle dimensioni delle diverse funzioni. Sto ancora usando JMP 15 e non posso usare Per ciascuno() ancora, ma per estendere ulteriormente l'esercizio di tempistica di Jeff inserisco altre due funzioni che danno lo stesso risultato.
Repeat(k = 0; {k++; Char( theList[k] )}, listsize);
Words( Substr( Char( theList ), 2, Length( Char( thelist ) ) - 2 ), ", " );

Il ciclo For, che è il più veloce per le liste piccole, è superato da Words a size>50, dalla funzione data-table-detour a size>1000 e da Repeat a size>30000.
Sono rimasto un po' sorpreso nel vedere che Words è rimasto il più veloce per size>50, circa il doppio più veloce con milioni di "parole".
Re: Come convertire una lista numerica in una di caratteri?Grazie per le informazioni aggiuntive @Jeff_Perkinson E @Craige_Hales !
Impariamo sempre tante cose con la Community!!
Re: Come convertire una lista numerica in una di caratteri?Estendere la risposta di Jeff
Different overheads hurt for small sizes and help for large sizes.Different overheads hurt for small sizes and help for large sizes.Spese generali diverse fanno male per le taglie piccole e aiutano per le taglie grandi.
dt = New Table( "Untitled 3",
Add Rows( 0 ),
New Column( "size", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "for", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "foreach", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "custom", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) )
);
NumListToChar = Function( {myList},
{defaultlocal},
dtx = New Table( "x", New Column( "y", values( myList ) ), private );
dtx:y << data type( character );
myList = dtx:y << get values;
Close( dtx, nosave );
Return( myList );
);
For( listsize = 1, listsize < 1e7, listsize *= 2,
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
For Each( {value, index}, theList, theList[index] = Char( value ) );
foreachloop = HP Time() - start;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
theList = NumListToChar( theList );
customfunction = HP Time() - start;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
For( i = 1, i <= N Items( theList ), i++,
theList[i] = Char( theList[i] )
);
forloop = HP Time() - start;
Show( foreachloop, customfunction, forloop );
dt << addrows( 1 );
dt:size[N Rows( dt )] = listsize;
dt:for[N Rows( dt )] = forloop / 1e6;
dt:foreach[N Rows( dt )] = foreachloop / 1e6;
dt:custom[N Rows( dt )] = customfunction / 1e6;
Wait( 0.1 ); // so it shows on display
);Re: Come convertire una lista numerica in una di caratteri?Ecco un rapido programma di temporizzazione per i tre metodi, per ciclo, per ciascuno e funzione personalizzata utilizzando la tabella dati.
Names Default To Here( 1 );
listsize=1000000;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
NumListToChar = Function( {myList},
{defaultlocal},
dtx = New Table( "x", New Column( "y", values( myList ) ), private );
dtx:y << data type( character );
myList = dtx:y << get values;
Close( dtx, nosave );
Return( myList );
);
start = HP Time();
For Each( {value, index}, theList, theList[index] = Char( value ) );
foreachloop = HP Time() - start;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
theList = NumListToChar( theList );
customfunction = HP Time() - start;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
For( i = 1, i <= N Items( theList ), i++,
theList[i] = Char( theList[i] )
);
forloop = HP Time() - start;
show(foreachloop, customfunction, forloop);
Per me con il listsize mostrato sopra i risultati sono molto simili tra i tre metodi:
foreachloop = 1106974;
customfunction = 1077862;
forloop = 1400643;
Re: Come convertire una lista numerica in una di caratteri?Grazie @Jeff_Perkinson !
Ho fatto delle simulazioni solo per curiosità per confrontare il tempo di esecuzione di ogni soluzione e sembra che per ogni funzione sia mediamente la più veloce!
Quindi sceglierò quello anche se la funzione di @txnelson funziona anche molto bene.
Grazie a tutti e due 
Re: Come convertire una lista numerica in una di caratteri?La novità di JMP 16 è il Funzione For Each() che itera su un contenitore - elenco, matrice o array associativo - per eseguire un'operazione su ciascun elemento.
Ecco un esempio per mostrare come usarlo per convertire il tuo elenco di numeri in un elenco di stringhe di caratteri.
Names Default To Here( 1 );
theList = {7, 8, 9};
For Each( {value, index}, theList, theList[index] = Char( value ) );
Re: Come convertire una lista numerica in una di caratteri?Grazie per la tua risposta @txnelson è infatti quello che stavo cercando.
Mi chiedo solo qual è il più veloce tra un ciclo e una funzione che comporta la creazione di tabelle. Qualche idea?
Re: Come convertire una lista numerica in una di caratteri?Ecco un piccolo script che crea una funzione che fa quello che vuoi.Puoi definire e utilizzare la funzione nel tuo codice o utilizzare le 4 istruzioni nel codice aperto per eseguire la conversione.
Names Default To Here( 1 );
theList = {7,8,9};
NumListToChar = Function( {myList},
{defaultlocal},
dtx = New Table( "x", New Column( "y", values( myList ) ), private );
dtx:y << data type( character );
myList = dtx:y << get values;
Close( dtx, nosave );
Return( myList );
);
theList = NumListToChar( theList );