如何在Julia中跨行查找最小非零元素的列的索引?

时间:2018-10-22 19:29:16

标签: julia

我的茱莉亚有一个nxm Array{Int64,2}。我想为每一行查找不为零的最小元素的列的索引。如果该行为零,则返回0。

例如,对于n=10m=2

julia> A
10×2 Array{Int64,2}:
 2  0
 1  1
 8  7
 0  0
 3  8
 0  0
 0  0
 2  4
 5  1
 6  0

我想回来

julia> B
10-element Array{Int64,1}:
 1
 1
 2
 1
 1
 1
 1
 1
 2
 1

这是我做的:

B = zeros(Int64, n);
for i in 1:n
    B[i] = findmin(A[i, :])[2];
end

但是当某行中的数字为零时,这将不起作用...

2 个答案:

答案 0 :(得分:1)

您还可以使用mapslices并指定适用于单行的函数。

首先,建立一个矩阵:

julia> A = [2 1; 1 2; -1 -2; 0 0; 0 5; 10 0]
6×2 Array{Int64,2}:
  2   1
  1   2
 -1  -2
  0   0
  0   5
 10   0

创建一个查找每行最少非零元素的索引的函数:

function findmincol(row)
    # handle the special case when all elements are 0
    if all(row .== 0)
        return 0
    end

    # check the number of zero elements
    length_zero = sum(row .== 0)

    # find the min among non-zero elements
    filter!(x -> x != 0, row)

    return findmin(row)[2] + length_zero
end

然后,您可以使用mapslicesfindmincol函数映射到A的每一行:

mapslices(findmincol, A, dims=2)

这为您(我认为是)提供了正确的解决方案:

6×1 Array{Int64,2}:
 2
 1
 2
 0
 2
 1

答案 1 :(得分:0)

大多数函数(sum, minimum, find, findmin等)使用dims关键字参数来指定执行所述操作的轴:

Ex

findmin(rand(3, 4), dims=1)
 ([0.15952 0.0289172 0.409214 0.195433], CartesianIndex{2}[CartesianIndex(3, 1) 
 CartesianIndex(2, 2) CartesianIndex(3, 3) CartesianIndex(3, 4)])

将实际的最小值和位置作为Cartesian Indices返回为两个单独的数组

所以:

v, i = findmin(randn(10, 2), dims=2)
i = map(t -> t[2], i)
i[v .== 0] .= 0

笛卡尔索引有点怪异,但显然经常用于多维索引