¿Cómo eliminar un conjunto de valores de una matriz/vector?Hola. Tengo un vector grande (es decir, una matriz 1-D) de valores, del cual me gustaría eliminar un subconjunto de valores, donde el subconjunto contiene un conjunto de valores no secuenciales del vector original. Por ejemplo:
vector grande = [1,2,3,4,5]
subconjunto = [2,5]
resultado deseado = [1,3,4]
Me pregunto si existe un comando simple o un conjunto de comandos que pueda hacer esto en JSL. Podría hacer esto con un For Loop, pero me pregunto si hay un método más elegante o más rápido.
Re: ¿Cómo eliminar un conjunto de valores de una matriz/vector?¡Gracias Jeff! 1000x es bastante bueno. De hecho, no me di cuenta de que a una fila se le podía asignar una matriz vacía para eliminarla.
Ya le sugerí al soporte técnico que era necesario cambiar el documento o que era necesario acelerar el método lento.
Re: ¿Cómo eliminar un conjunto de valores de una matriz/vector?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>
Resultados:
data_table_method = 1.0333333333333;
matrix_method1 = 49.166666666667;
matrix_method2 = 0.066666666666606;
@Craige_Hales El método (matrix_method2) es el más rápido.
Tenía curiosidad por saber si el uso de una tabla de datos sería rápido y, aunque es 15 veces más lento que matrix_method2, sigue siendo bastante rápido para este problema de tamaño modesto. Entonces tenía curiosidad por ver cuánto tiempo tomaría si sus datos ya están en una tabla de datos (evitando la conversión a/desde la tabla de datos) y se vuelve aún más rápido.
foo = As Table( DataM, <<INVISIBLE></INVISIBLE>
Resultados:
data_table_method2 = 0.316666666666606
Re: ¿Cómo eliminar un conjunto de valores de una matriz/vector?Sí. Obtén la loc opuesta, usando !=, luego
DatosM = DatosM[rr,0];
Debería ser 100 veces más rápido.
Sospecho que la forma en que lo está haciendo recrea la matriz para cada fila eliminada.Re: ¿Cómo eliminar un conjunto de valores de una matriz/vector?@Craige_Hales ,
¿Tiene alguna idea sobre cómo eliminar filas de una matriz grande de manera eficiente?
Tengo una situación en la que tengo una matriz de datos que es> 1 millón de filas x 9 columnas (1,604,736 x 9 en el ejemplo que tengo ahora mismo)
Necesito eliminar algunas filas, en realidad > 78 k filas. Esto es lo que estoy haciendo ahora
rr = Loc(DataM[0,4] == 1);
DataM[rr,0] = [];
Así que estoy buscando casos en los que la cuarta columna = 1 y quiero que desaparezcan todas esas filas.
¡La línea Loc() es súper rápida (< 0.05 segundos) pero la siguiente línea es súper lenta (83 segundos)!
Estoy usando la documentación de JMP donde leí:
La eliminación de filas y columnas se logra asignando una matriz vacía a esa fila o columna.
A[k, 0] = []; // elimina la k-ésima fila
A[0, k] = []; // elimina la columna k-ésima
Tal vez solo estoy atascado porque mi matriz de datos es grande
No me queda claro si podría usar el truco de la matriz asociativa ya que estoy tratando con una matriz y no con un vector.
Tomás
Re: ¿Cómo eliminar un conjunto de valores de una matriz/vector?Gracias Craige.
Su primera suposición fue correcta: deseo eliminar los valores literales de 2 y 5 del vector que contiene 1,2,3,4,5. Otro ejemplo para ayudar a aclarar, deseo eliminar este vector de subconjunto de largevect:
vector grande = [12, 189, 3, 78, -2]
subconjunto = [189, -2]
resultado deseado = [12, 3, 78]
No he usado mucho AA, pero me gusta esto como solución. ¡Gracias por la ayuda!
Re: ¿Cómo eliminar un conjunto de valores de una matriz/vector?Probablemente necesite más información para responder esto bien.
Si está realizando operaciones de ajuste, consulte Operaciones de conjunto JSL para una manera de hacer esto con matrices asociativas:
// 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];
No está claro en su ejemplo si subconjunto es una lista de valores, o los índices de los valores. Si son los índices, y puede generar el conjunto de índices para mantener en lugar del conjunto para eliminar, entonces es tan simple como
largevect = [20, 30, 40, 50, 10];
keepers = [1,3,4];
desired result = largevect[ keepers ];
show(desiredResult); // [20, 40, 50];