こんにちは、
リストのリストや行列で新しい Where 関数を使用するにはどうすればよいですか?
xs = {10, 20, 30, 50};
Where( Print(xs); xs ==10 );
xs = {[10 20], [30 50]};
Where( Print(xs); xs ==[10 20] );最初のもの
xs = {10, 20, 30, 50};
v=Where( xs ==10 );
print(v);
2番目についてはよく分かりません
最初のものは実例として意図されていた:)
内側に印刷する場所:
ループ中にxs が実際に個々の要素を参照していることを示します。
[すごい! - でも簡単な構文を説明しています]
「個々の要素を参照します」
...実際には 2 番目の例のようになります。
2番目の結果について疑問に思います。xsは[10 20]ですが、 Whereでは一致するものが見つかりません。

リストにもう1つアイテムを追加すると、Whereが壊れます。エラーメッセージはよくわかりません。
Not all sequences are the same size in access or evaluation of 'Where' , Bad Argument(
Print(xs);
xs == [10 20];
), Where/*###*/(Print(xs) ; xs == [10 20])
Names Default To Here(1);
xs = {[10 20], [30 50], [10 20]};
Where(
Print(xs);
xs == [10 20];
);
スクリプト インデックスの他の例がこれに最も近いようですが、この場合はインデックス 1 を使用しても実際には機能しません。
エヴァン・マコークル
次のように単純に比較すると
Names Default To Here(1);
xs = {[10 20], [30 50], [10 20]};
mask = Repeat(Eval List({[10 20]}), N Items(xs));
xs[1] == mask[1];
1 は返されず、[1 1] が返されます (つまり、一致ごとに 1 つ)。 All を使用してこれを 1 に変換できるはずですが、Where ではそれもできません (マトリックスの最初の項目のみを比較しているようです)。
Names Default To Here(1);
xs = {[10 20], [30 20]};
Where(Show(xs == [10 20])); // [1 0] and [0 1]
xs[1]で試してみると、3番目の項目を追加する(または1つ削除する)まで機能するので、おそらく間違ったものを比較していることになります。
Names Default To Here(1);
xs = {[10 20], [30 20]};
r = Where(
Show(xs[1] == [10 20]);
xs[1] == [10 20];
);
最終的に、多くの試行錯誤と推測作業を経て、少なくとも時々はこれが機能しました(マスク用の大きなマトリックスを作成するかどうかはよくわかりません)。適切に文書化されていない限り、これは、Where() からこのタイプの比較に対して期待されるものではありません。
</CODE></PRE>
<P>また、この方法だとLoc()を使用するよりも遅くなるようですが、私のテストに欠陥がある可能性があります</P>
<DIV class="lia-spoiler-container"><A class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer" target="_blank">もっと見る...</A><NOSCRIPT>(ハイライトして読んでください)</NOSCRIPT><DIV class="lia-spoiler-border"><DIV class="lia-spoiler-content">
<PRE><CODE class=" language-jsl">Names Default To Here(1);
testitems = 300;
//xs = {[10 20], [30 20], [10 20]};
xs = Repeat({[10 20]}, testitems / 3);
xs = xs || Repeat({[30 20]}, testitems / 3);
xs = xs || Repeat({[1 2]}, testitems / 3);
xs = xs[Random Shuffle(1::testitems)];
testcount = 10000;
where_speed = Repeat({.}, testcount);
loc_speed = Repeat({.}, testcount);
matches = Repeat({.}, testcount);
category = Repeat({""}, testcount);
expr1 = Expr(
wait(0);
a = HP Time();
mask = Repeat(Eval List({[10 20]}), N Items(xs));
r1 = Where(All(xs == mask));
wait(0);
b = HP Time();
);
expr2 = Expr(
wait(0);
c = HP Time();
r2 = Loc(xs, [10 20]);
wait(0);
d = HP Time();
);
For(i = 1, i <= testcount, i++,
wait(0);
If(Random Integer(1, 2) == 2,
expr2;
expr1;
cur_cat = "Loc";
,
expr1;
expr2;
cur_cat = "Where";
);
where_speed[i] = b - a;
loc_speed[i] = d - c;
category[i] = "Loc";
matches[i] = Try(All(r1 == r2), 0);
wait(0);
);
dt = New Table("Test",
Add Rows(testcount),
New Column("Row", Numeric, Ordinal, Formula(Row())),
New Column("Locs", Numeric, Continuous, Values(loc_speed)),
New Column("Where", Numeric, Continuous, Values(where_speed)),
New Column("Matches", Numeric, Nominal, Values(matches)),
New Column("Category", Character, Nominal, Values(category))
);
tab = dt << Tabulate(
Show Control Panel(0),
Add Table(
Column Table(Analysis Columns(:Locs, :Where)),
Row Table(
Grouping Columns(:Category),
Statistics(Mean, Median, Std Dev, Interquartile Range)
)
)
);Names Default To Here(1);
xs = {[10 20], [30 20], [10 20]};
mask = Repeat(Eval List({[10 20]}), N Items(xs));
r = Where(
//show(xs, mask, xs == mask, All(xs == mask));
All(xs == mask);
);
洞察力とマスク経由のトリックに感謝します - はるかに速い
Where( xs[0,1] ==10 & xs[0,2] ==20 );
...しかし、 場所に勝つチャンスはありません。
ちょっと驚きました...

同じエラーが発生しました:
Not all sequences are the same size in access or evaluation of 'Where' , Bad Argument
今回は「Contains」関数を使用しています。同じ引数を「Get Rows Where」関数内で使用した場合も、期待どおりに動作します。
以下に最小限の例を示します。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
names = {"KATIE", "JAMES"};
r1 = dt << Get Rows Where( Contains(names, :name) );
r2 = Where( Contains(names, :name) );
Show( r1, r2 );
r1 は機能しますが、r2 はエラーをスローします。