Come rimuovere un insieme di valori da una matrice/vettore?Ciao. Ho un grande vettore (cioè matrice 1-D) di valori, da cui vorrei rimuovere un sottoinsieme dei valori, dove il sottoinsieme contiene un insieme non sequenziale di valori dal vettore originale. Per esempio:
grandevetto = [1,2,3,4,5]
sottoinsieme = [2,5]
risultato desiderato = [1,3,4]
Mi chiedo se esiste un semplice comando o un insieme di comandi che potrebbe farlo in JSL? Potrei farlo con un For Loop, ma mi chiedo se esiste un metodo più elegante o più veloce?
Ri: Come rimuovere un insieme di valori da una matrice/vettore?Grazie Jeff! 1000x è abbastanza buono. In realtà non mi ero reso conto che a una riga potesse essere assegnata una matrice vuota per eliminarla.
Ho già suggerito al supporto tecnico che il documento doveva essere modificato o che il metodo lento doveva essere accelerato.
Ri: Come rimuovere un insieme di valori da una matrice/vettore?DataM = J( 1067000, 8, Random Normal() ) || J( 1067000, 1, Random Binomial( 1, 0.07 ) );
DataM1 = DataM;
DataM2 = DataM;
Close( dt, nosave );
start = Tick Seconds();
foo = As Table( DataM, <<INVISIBLE></INVISIBLE>
Risultati:
data_table_method = 1.0333333333333;
matrix_method1 = 49.166666666667;
matrix_method2 = 0.066666666666606;
@Craige_Hales ' (matrix_method2) è il più veloce.
Ero curioso di sapere se l'utilizzo di una tabella dati sarebbe stato veloce e, sebbene sia 15 volte più lento di matrix_method2, è comunque abbastanza veloce per questo problema di dimensioni modeste. Ero quindi curioso di vedere quanto tempo ci sarebbe voluto se i tuoi dati fossero già in una tabella di dati (evitando la conversione da/verso la tabella di dati) e diventasse ancora più veloce.
foo = As Table( DataM, <<INVISIBLE></INVISIBLE>
Risultati:
data_table_method2 = 0.316666666666606
Ri: Come rimuovere un insieme di valori da una matrice/vettore?Sì. Ottieni il loc opposto, usando !=, quindi
DatiM = DatiM[rr,0];
Dovrebbe essere 100 volte più veloce.
Sospetto che il modo in cui lo stai facendo ricrea l'array per ogni riga eliminata.Ri: Come rimuovere un insieme di valori da una matrice/vettore?@Craige_Hales ,
hai qualche idea sulla rimozione efficiente delle righe da una matrice di grandi dimensioni?
Ho una situazione in cui ho una matrice di dati che è> 1 milione di righe x 9 colonne (1.604.736 x 9 nell'esempio davanti a me in questo momento)
Devo rimuovere alcune righe, in realtà> 78 k righe da esso. Ecco cosa sto facendo in questo momento
rr = Loc(DataM[0,4] == 1);
DataM[rr,0] = [];
Quindi sto cercando casi in cui la 4a colonna = 1 e voglio che tutte quelle righe spariscano.
La riga Loc() è super veloce (<0.05 sec) ma la riga seguente è super lenta (83 secondi)!
Sto usando la documentazione JMP dove ho letto:
L'eliminazione di righe e colonne viene eseguita assegnando una matrice vuota a quella riga o colonna.
A[k, 0] = []; // cancella la k-esima riga
A[0, k] = []; // cancella la k-esima colonna
Forse sono solo bloccato perché la mia matrice di dati è grande
Non mi è chiaro se potrei usare il trucco dell'Associative Array dato che ho a che fare con una matrice e non con un vettore
Tom
Ri: Come rimuovere un insieme di valori da una matrice/vettore?Grazie Craig.
La tua prima ipotesi era corretta: desidero rimuovere i valori letterali di 2 e 5 dal vettore contenente 1,2,3,4,5. Un altro esempio per aiutare a chiarire, desidero rimuovere questo vettore di sottoinsieme da largevect:
vettore grande = [12, 189, 3, 78, -2]
sottoinsieme = [189, -2]
risultato desiderato = [12, 3, 78]
Non ho usato molto AA, ma mi piace come soluzione. Grazie per l'aiuto!
Ri: Come rimuovere un insieme di valori da una matrice/vettore?Probabilmente servono più informazioni per rispondere bene.
Se stai eseguendo operazioni sugli insiemi, vedi Operazioni sugli insiemi JSL per un modo per farlo con gli array associativi:
// this would be a little more natural using lists
// or associative arrays, but it is easy to make an
// associative array set from a matrix:
largevect = [20, 30, 40, 50, 10];
subset = [20, 50];
aaBigSet = Associative Array( largevect );
aaSmallSet = Associative Array( subset );
// remove the small set from the big set
aaBigSet << Remove( aaSmallSet );
// getkeys returns a list, make a matrix
result = Matrix( aaBigSet << getkeys );
// the original order is lost, but the set is correct
show(result); // [10, 30, 40];
Non è chiaro nel tuo esempio se sottoinsieme è un elenco di valori o gli indici dei valori. Se sono gli indici e potresti generare l'insieme di indici da conservare invece dell'insieme da rimuovere, allora è semplice come
largevect = [20, 30, 40, 50, 10];
keepers = [1,3,4];
desired result = largevect[ keepers ];
show(desiredResult); // [20, 40, 50];