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

如何在Julia中跨行查找最小非零元素列的索引?,julia,Julia,我在Julia中有一个nxm数组{Int64,2}。我想找出每一行中,最小元素列的索引不是零。如果行为零,则返回0 例如,对于n=10和m=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

我在Julia中有一个
nxm数组{Int64,2}
。我想找出每一行中,最小元素列的索引不是零。如果行为零,则返回0

例如,对于
n=10
m=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
但当某一行中有零时,这不起作用…

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

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

因此:

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

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

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

因此:


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

您也可以使用
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
然后可以使用
mapsicles
findmincol
函数映射到
A
的每一行:

mapslices(findmincol, A, dims=2)
这为您(我认为是)提供了正确的解决方案:

6×1 Array{Int64,2}:
 2
 1
 2
 0
 2
 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
然后可以使用
mapsicles
findmincol
函数映射到
A
的每一行:

mapslices(findmincol, A, dims=2)
这为您(我认为是)提供了正确的解决方案:

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

如果一行中有负值,这个函数应该怎么做?如果有一些零和一些负值,它应该返回最小非零元素的索引。如果全部为零,它应该返回0。如果一行中有负值,该函数应该做什么?如果有一些零和一些负值,它应该返回最小非零元素的索引。如果全部为零,则应返回0。