logo

ジュリアで配列の要素がリストに属しているかを確認する方法 📂ジュリア

ジュリアで配列の要素がリストに属しているかを確認する方法

ガイド 1

julia> x = rand('a':'c', 10)
10-element Vector{Char}:
 'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)
 'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)
 'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
 'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
 'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
 'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
 'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
 'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
 'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
 'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)

上に示されたような配列があるとしよう。例で、私たちの目標は'a''b' の両方を選ぶことだとしよう。自然には包含演算子 $\in$でブロードキャストすればいいと思うかもしれないが、結果は以下の通りだ。

julia> x .∈ ['a', 'b']
ERROR: DimensionMismatch("arrays could not be broadcast to a common size; got a dimension with lengths 10 and 2")

DimensionMismatch エラーが発生した。これは配列 x とカテゴリー ['a', 'b'] の両方に同時にブロードキャストが行われたために起きたエラーだ。エラーメッセージを解釈すると、x の長さ10と ['a', 'b'] の長さ2が同時に入ってきて混乱しているということだ。

julia> x .∈ Ref(['a', 'b'])
10-element BitVector:
 1
 1
 1
 0
 1
 0
 0
 0
 1
 1

この場合は Ref() 関数を使ってブロードキャスト問題を解決できる。これにより ['a', 'b'] 内の 'a''b' がスカラとして扱われ、このように二つのキャラクターがある場所だけを見つけることができた。

注意事項

julia> y = rand('a':'c', 1, 10)
1×10 Matrix{Char}:
 'b'  'a'  'b'  'b'  'a'  'c'  'a'  'b'  'b'  'c'

上に示されたような $1 \times 10$ 行列の場合を考えてみよう。一見すると、上のガイドで見た場合と何も変わらないように思えるかもしれないが、.∈が全く異なる方法で使われている。

julia> y .∈ ['a', 'b']
2×10 BitMatrix:
 0  1  0  0  1  0  1  0  0  0
 1  0  1  1  0  0  0  1  1  0

見ての通り、最初の行は 'a' の位置を、二行目は 'b' の位置を示している。これはベクトルか行列かという違いに由来するものだ。

julia> y .∈ Ref(['a', 'b'])
1×10 BitMatrix:
 1  1  1  1  1  0  1  1  1  0

Ref() を使う場合、一貫した結果を得ることができる。

環境

  • OS: Windows
  • julia: v1.7.0