配列・行列のなかで条件を満たすものを取り出す・要素数を出す
条件がベクトル・行列で与えられている場合
その場合はこちら:
以下の節で説明するのは、条件が数である場合。
Julia v1.0から、スパース行列を扱う場合はusing SparseArrays
を読み込む必要があります。
配列・行列のなかで条件を満たすものを取り出す
配列から値を取り出す
例えば
v = [1 2 2 3 5]
のなかで2以上の要素の値を取り出すには
filter(x->x>2, v)
または
v[v.>2]
ここで、.
は、「要素ごとに見る」というやつ。
配列からインデックスを取り出す
find(x->(x>2),v)
または、
find(v.>2)
行列から値を取り出す
例えば
A = [7 10; 5 9; 9 8]
という3-by-2の行列で、
一列目の要素が9である行を取り出すには、
A[A[:,1].==9,:]
配列と本質的には同じだけど、.
のことを知らないと、ハマる。
行列からインデックスを取り出す
find(A[:,1].>6)
2-element Array{Int64,1}:
1
3
(スパース)行列で非ゼロの要素を取り出す
ここでの操作はデータの型としてスパース行列*1になっていないとダメ。
行列Aをスパース行列として持っていなければ、
B = [0 1 2 0; 0 0 0 5] B = sparse(B)
として変換しておく。
非ゼロの要素を取り出すには、
nonzeros(B)
3-element Array{Int64,1}:
1
2
5
インデックスを取り出しは、前節と同様。
配列・行列のなかで条件を満たす要素数を出す
条件を満たす要素の数:MATLABのnnz()
Juliaでは。countnz
なので注意
v0.7からcountnz
は廃止になり、count関数を使うことになったようです。
https://github.com/JuliaLang/julia/pull/23485
例えば、
a = [3 5 6 8] # countnz(a.<6) # v0.6 count(a.<6) # > v0.7
2
配列でも行列でも同じ。
(スパース)行列の非ゼロ要素数
じゃあJuliaでnnzは?というと、それはスパース行列の非ゼロ要素数。
こんなかんじ。
I = [1 2 4 1]' J = [2 1 5 2]' V = ones(4,1) M = sparse(I[:,1],J[:,1],V[:,1]) nnz(M)
3
- (1,2)要素は重複しているので、これはカウントされていない。(これはnnzの性質ではなくて、
sparse
の話。) - 普通の行列として持っている場合には、ちゃんとスパース行列の型にしておく。
*1:データがスパース性を持っているかとは関係ない。