我的茱莉亚有一个nxm Array{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
但是当某行中的数字为零时,这将不起作用...
答案 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
然后,您可以使用mapslices
将findmincol
函数映射到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
笛卡尔索引有点怪异,但显然经常用于多维索引