行列/ベクトルから一連の値を削除するには?やあ。 値の大きなベクトル (つまり 1-D マトリックス) があり、そこから値のサブセットを削除したいと考えています。このサブセットには、元のベクトルからの値の連続していないセットが含まれています。 例えば:
largevect = [1,2,3,4,5]
サブセット = [2,5]
望ましい結果 = [1,3,4]
JSLでこれを実行できる単純なコマンドまたはコマンドのセットが存在するかどうか疑問に思っていますか? For ループを使用してこれを行うこともできますが、より洗練された、またはより高速な方法があるかどうか疑問に思っていますか?
Re: 行列/ベクトルから一連の値を削除するには?ありがとうジェフ! 1000xはかなり良いです。 行を削除するために空の行列を割り当てることができることに実際には気づきませんでした。
ドキュメントを変更する必要があるか、遅いメソッドを高速化する必要があることを技術サポートに提案しました。
Re: 行列/ベクトルから一連の値を削除するには?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
Re: 行列/ベクトルから一連の値を削除するには?はい。 != を使用して反対の loc を取得し、次に
DataM = DataM[rr,0];
100倍速くなるはずです。
あなたが行っている方法は、削除された行ごとに配列を再作成すると思われます。Re: 行列/ベクトルから一連の値を削除するには?@Craige_Hales 、
大きなマトリックスから行を効率的に削除することについて何か考えはありますか?
> 100 万行 x 9 列 (現在の前の例では 1,604,736 x 9) のデータ マトリックスがある状況があります。
いくつかの行を削除する必要がありますが、実際には 78,000 行を超えています。 これが私が今していることです
rr = Loc(DataM[0,4] == 1);
DataM[rr,0] = [];
したがって、4 列目 = 1 の場合を探しており、それらの行をすべて削除したいと考えています。
Loc() 行は超高速 (< 0.05 秒) ですが、次の行は超低速 (83 秒) です!
私が読んだJMPドキュメントを使用しています:
行と列を削除するには、その行または列に空の行列を割り当てます。
A[k、0] = []; // k 番目の行を削除します
A[0, k] = []; // k 番目の列を削除します
私のデータマトリックスが大きいので、私は立ち往生しているのかもしれません
ベクトルではなく行列を扱っているため、連想配列のトリックを使用できるかどうかはわかりません
トム
Re: 行列/ベクトルから一連の値を削除するには?ありがとうクレイジ。
最初の仮定は正しかった: 1,2,3,4,5 を含むベクトルから 2 と 5 のリテラル値を削除したい.明確にするための別の例として、次のサブセット ベクトルを largevect から削除します。
largevect = [12, 189, 3, 78, -2]
サブセット = [189, -2]
望ましい結果 = [12, 3, 78]
私は AA をあまり使用していませんが、これは解決策として気に入っています。 助けてくれてありがとう!
Re: 行列/ベクトルから一連の値を削除するには?これにうまく答えるには、おそらくもっと情報が必要です。
セット操作を行う場合は、を参照してください。 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];