Comment supprimer un ensemble de valeurs d'une matrice/vecteur ?Salut. J'ai un grand vecteur (c'est-à-dire une matrice 1-D) de valeurs, dont je voudrais supprimer un sous-ensemble de valeurs, où le sous-ensemble contient un ensemble non séquentiel de valeurs du vecteur d'origine. Par exemple:
grandvect = [1,2,3,4,5]
sous-ensemble = [2,5]
résultat souhaité = [1,3,4]
Je me demande s'il existe une commande simple ou un ensemble de commandes qui pourraient le faire dans JSL? Je pourrais le faire avec une boucle For, mais je me demande s'il existe une méthode plus élégante ou plus rapide ?
Re : Comment supprimer un ensemble de valeurs d'une matrice/d'un vecteur ?Merci Jeff! 1000x c'est plutôt pas mal. En fait, je ne savais pas qu'une ligne pouvait se voir attribuer une matrice vide pour la supprimer.
J'ai déjà suggéré au support technique que la doc devait changer ou que la méthode lente devait être accélérée.
Re : Comment supprimer un ensemble de valeurs d'une matrice/d'un vecteur ?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>
Résultats:
data_table_method = 1.0333333333333;
matrix_method1 = 49.166666666667;
matrix_method2 = 0.066666666666606;
@Craige_Hales ' (matrix_method2) est la plus rapide.
J'étais curieux de savoir si l'utilisation d'une table de données serait rapide et, bien qu'elle soit 15 fois plus lente que matrix_method2, elle reste assez rapide pour ce problème de taille modeste. J'étais alors curieux de voir combien de temps cela prendrait si vos données sont déjà dans une table de données (en évitant la conversion vers/depuis la table de données) et cela devient encore plus rapide.
foo = As Table( DataM, <<INVISIBLE></INVISIBLE>
Résultats:
data_table_method2 = 0.316666666666606
Re : Comment supprimer un ensemble de valeurs d'une matrice/d'un vecteur ?Oui. Obtenez la loc opposée, en utilisant !=, puis
DonnéesM = DonnéesM[rr,0] ;
Devrait être 100 fois plus rapide.
Je soupçonne que la façon dont vous le faites recrée le tableau pour chaque ligne supprimée.Re : Comment supprimer un ensemble de valeurs d'une matrice/d'un vecteur ?@Craige_Hales ,
avez-vous des idées sur la suppression efficace des lignes d'une grande matrice ?
J'ai une situation où j'ai une matrice de données qui est> 1 million de lignes x 9 colonnes (1 604 736 x 9 dans l'exemple devant moi en ce moment)
J'ai besoin de supprimer certaines lignes, en fait> 78 000 lignes. Voici ce que je fais en ce moment
rr = Loc(DataM[0,4] == 1);
DataM[rr,0] = [];
Je recherche donc des cas où la 4ème colonne = 1 et je veux que toutes ces lignes disparaissent.
La ligne Loc() est super rapide, ( < 0.05 sec ) mais la ligne suivante est super lente ( 83 secondes ) !
J'utilise la documentation JMP où je lis:
La suppression de lignes et de colonnes s'effectue en affectant une matrice vide à cette ligne ou colonne.
A[k, 0] = [] ; // supprime la kème ligne
A[0, k] = [] ; // supprime la kième colonne
Peut-être que je suis juste bloqué parce que ma matrice de données est volumineuse
Il n'est pas clair pour moi si je pourrais utiliser l'astuce Associative Array puisque j'ai affaire à une matrice et non à un vecteur
À M
Re : Comment supprimer un ensemble de valeurs d'une matrice/d'un vecteur ?Merci Craig.
Votre première hypothèse était correcte : je souhaite supprimer les valeurs littérales de 2 et 5 du vecteur contenant 1,2,3,4,5. Un autre exemple pour aider à clarifier, je souhaite supprimer ce vecteur de sous-ensemble de largevect :
largevect = [12, 189, 3, 78, -2]
sous-ensemble = [189, -2]
résultat souhaité = [12, 3, 78]
Je n'ai pas beaucoup utilisé les AA, mais j'aime cela comme solution. Merci pour l'aide!
Re : Comment supprimer un ensemble de valeurs d'une matrice/d'un vecteur ?Probablement besoin de plus d'informations pour bien répondre à cette question.
Si vous effectuez des opérations d'ensemble, voir Opérations sur les ensembles JSL pour un moyen de le faire avec des tableaux associatifs:
// 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];
Il n'est pas clair dans votre exemple si sous-ensemble est une liste de valeurs ou les index de valeurs. S'il s'agit des index et que vous pouvez générer l'ensemble d'index à conserver au lieu de l'ensemble à supprimer, alors c'est aussi simple que
largevect = [20, 30, 40, 50, 10];
keepers = [1,3,4];
desired result = largevect[ keepers ];
show(desiredResult); // [20, 40, 50];