🚀

Julia言語の配列において条件を満たす行を削除する

2023/12/28に公開2

概要

Julia言語の配列において条件を満たす行を削除する方法を記載する。

参考コード

data = [
    [1, 0, 0],
    [0, 0, 0],
    [0, 1, 0],
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 1]
]

filtered_data = [line for line in data if !all(n -> n == 0, line)]

@show filtered_data # filtered_data = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]

Discussion

antimon2antimon2

少し高度になりますが、この場合は、内包表記を使わずにBoolインデクシング(条件を記述して要素を抽出する書き方)でも良いですね。

data = [
    [1, 0, 0],
    [0, 0, 0],
    [0, 1, 0],
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 1]
]

filtered_data = data[.!all.(==(0), data)]

@show filtered_data  ## filtered_data = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]

あとJuliaではジャグ配列(配列の配列)よりも、(各行の要素数が同じ、つまり矩形になるなら)2次元配列を使った方がメモリ効率や速度面等でのパフォーマンスが良くなります。
その場合の例も挙げておきます。

data2d = [
    1 0 0
    0 0 0
    0 1 0
    0 0 0
    0 0 0
    0 0 1
]  # → 6×3 Matrix{Int64}になる

filtered_data2d = data2d[.!all.(==(0), eachrow(data2d)), :]

@show filtered_data2d  ## filtered_data2d = [1 0 0; 0 1 0; 0 0 1]

以上、参考までに。

原子軌道原子軌道

コメントありがとうございます。周りに使っている人が居ないので、大変助かります。(別件ですが実践Julia入門、購入しています!!)