如何从矩阵/向量中删除一组值?你好。 我有一个大的值向量(即一维矩阵),我想从中删除值的子集,其中该子集包含原始向量中的一组非顺序值。 例如:
大向量 = [1,2,3,4,5]
子集 = [2,5]
期望结果 = [1,3,4]
我想知道是否存在可以在 JSL 中执行此操作的简单命令或命令集? 我可以使用 For 循环来做到这一点,但想知道是否有更优雅或更快速的方法?
回复:如何从矩阵/向量中删除一组值?谢谢杰夫! 1000倍已经很不错了。 我实际上没有意识到可以为一行分配一个空矩阵来删除它。
我已经向技术支持建议该文档需要更改或需要加快缓慢的方法。
回复:如何从矩阵/向量中删除一组值?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>
结果:
data_table_method = 1.0333333333333;
matrix_method1 = 49.166666666667;
matrix_method2 = 0.066666666666606;
@Craige_Hales ' 方法 (matrix_method2) 是最快的。
我很好奇使用数据表是否会很快,虽然它比 Matrix_method2 慢 15 倍,但对于这个中等大小的问题来说它仍然相当快。 然后我很好奇,如果您的数据已经在数据表中(避免与数据表之间的转换),那么需要多长时间,而且速度会更快。
foo = As Table( DataM, <<INVISIBLE></INVISIBLE>
结果:
data_table_method2 = 0.316666666666606
回复:如何从矩阵/向量中删除一组值?是的。 使用 != 获取相反的位置,然后
数据M = 数据M[rr,0];
应该快 100 倍。
我怀疑你这样做的方式会为每个删除的行重新创建数组。回复:如何从矩阵/向量中删除一组值?@Craige_Hales ,
您对有效地从大矩阵中删除行有什么想法吗?
我遇到的情况是,我的数据矩阵大于 100 万行 x 9 列(现在前面的示例中为 1,604,736 x 9 )
我需要删除一些行,实际上> 78 k 行。 这就是我现在正在做的事情
rr = Loc(DataM[0,4] == 1);
DataM[rr,0] = [];
所以我正在寻找第 4 列 = 1 的情况,并且我希望所有这些行都消失。
Loc() 行非常快(< 0.05 秒),但下面的行非常慢(83 秒)!
我正在使用 JMP 文档,我在其中读到:
删除行和列是通过将空矩阵分配给该行或列来完成的。
A[k, 0] = []; //删除第k行
A[0, k] = []; //删除第k列
也许我只是因为我的数据矩阵很大而陷入困境
我不清楚是否可以使用关联数组技巧,因为我正在处理矩阵而不是向量
汤姆
回复:如何从矩阵/向量中删除一组值?谢谢克雷格。
您的第一个假设是正确的:我希望从包含 1,2,3,4,5 的向量中删除 2 和 5 的文字值。另一个有助于澄清的例子,我希望从largevect中删除这个子集向量:
大向量 = [12, 189, 3, 78, -2]
子集 = [189, -2]
期望结果 = [12, 3, 78]
我不太用过 AA,但我喜欢用它作为解决方案。 谢谢您的帮助!
回复:如何从矩阵/向量中删除一组值?可能需要更多信息才能很好地回答这个问题。
如果您正在进行集合运算,请参阅JSL集合操作有关使用关联数组执行此操作的方法:
// 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];
您的示例中不清楚是否子集是值列表或值的索引。 如果是索引,并且您可以生成要保留的索引集而不是要删除的索引集,那么就很简单
largevect = [20, 30, 40, 50, 10];
keepers = [1,3,4];
desired result = largevect[ keepers ];
show(desiredResult); // [20, 40, 50];