Art*_*Lin 6 julia matrix-indexing
我想过滤矩阵的每一行,a使每一行都包含非负值。
首先,我尝试了这个:
\njulia> a = [-1 2 3; 4 5 6; -5 3 4; 3 5 5]\n4\xc3\x973 Matrix{Int64}:\n -1 2 3\n 4 5 6\n -5 3 4\n 3 5 5\n\njulia> # Desired Operation after filtering should yield 2x3 matrix, [4 5 6; 3 5 5]\n\njulia> mask1 = a .>= 0\n4\xc3\x973 BitMatrix:\n 0 1 1\n 1 1 1\n 0 1 1\n 1 1 1\n\njulia> a[mask1]\n10-element Vector{Int64}:\n 4\n 3\n 2\n 5\n 3\n 5\n 3\n 6\n 4\n 5\nRun Code Online (Sandbox Code Playgroud)\n这第一次尝试使我的矩阵变平。当我执行 [mask1, :] 时,也会发生同样的事情。
\n我的第二次尝试是这样的(等效逻辑使用 python 的 numpy 工作):
\njulia> mask2 = minimum(a, dims=2) .>= 0\n4\xc3\x971 BitMatrix:\n 0\n 1\n 0\n 1\n\njulia> a[mask2, :]\n2\xc3\x971 Matrix{Int64}:\n 4\n 3\nRun Code Online (Sandbox Code Playgroud)\n当我想要整个第二行和第四行时,我的第二次尝试仅捕获第二行和第四行的第一个元素。请注意,如果我对 mask2 使用等效的布尔数组,我确实得到了所需的结果:
\njulia> mask3 = [false; true; false; true]\n4-element Vector{Bool}:\n 0\n 1\n 0\n 1\n\njulia> a[mask3, :]\n2\xc3\x973 Matrix{Int64}:\n 4 5 6\n 3 5 5\nRun Code Online (Sandbox Code Playgroud)\n那么,进行逐行过滤以将 BitMatrix 转换为 Vector{Bool} 的惯用方法是,还是有更干净的方法?另外,问题的关键是为什么 BitMatrix 只返回一行的一个元素,而 Vector{Bool} 返回整行。
\n一种可能的方式:
\njulia> a[[all(row.>=0) for row in eachrow(a)], :]\n2\xc3\x973 Matrix{Int64}:\n 4 5 6\n 3 5 5\nRun Code Online (Sandbox Code Playgroud)\n另一个:
\njulia> a[findall(x->all(x .>=0), eachrow(a)), :]\n2\xc3\x973 Matrix{Int64}:\n 4 5 6\n 3 5 5\nRun Code Online (Sandbox Code Playgroud)\n您尝试执行的版本minimum是:
julia> a[minimum.(eachrow(a)) .>= 0, :]\n2\xc3\x973 Matrix{Int64}:\n 4 5 6\n 3 5 5\nRun Code Online (Sandbox Code Playgroud)\n或遵循 @DNF 建议,这实际上是最好的:
\njulia> a[all.(>=(0), eachrow(a)), :]\n2\xc3\x973 Matrix{Int64}:\n 4 5 6\n 3 5 5\nRun Code Online (Sandbox Code Playgroud)\n