在Julia中,“argmax().I”是什么意思?

3

这里有一个来自StatWithJuliaBook的优秀示例(请查找以下内容)

它演示了如何平滑绘制stars.png的星空图。

我的问题是关于argmax().I。根据作者的说法,“请注意在每个argmax末尾使用的“ .I ”,它提取列优先坐标的值。”

这是什么意思?还有其他参数吗?我在文档中找不到任何说明。

根据作者的说法,它似乎是沿列方向最大值的位置,但是当我尝试argmax(gImg, dims=2)时,结果不同。

#julia> yOriginal, xOriginal = argmax(gImg).I
#(192, 168)


#julia> yy, xx = argmax(gImg, dims = 2)
#400×1 Matrix{CartesianIndex{2}}:
# CartesianIndex(1, 187)
# CartesianIndex(2, 229)# CartesianIndex(399, 207)
# CartesianIndex(400, 285)

#julia> yy, xx
#(CartesianIndex(1, 187), CartesianIndex(2, 229))

请给予建议。

using Plots, Images; pyplot()

img = load("stars.png")
gImg = red.(img)*0.299 + green.(img)*0.587 + blue.(img)*0.114
rows, cols = size(img)

println("Highest intensity pixel: ", findmax(gImg))

function boxBlur(image,x,y,d)
    if x<=d || y<=d || x>=cols-d || y>=rows-d
        return image[x,y]
    else
        total = 0.0
        for xi = x-d:x+d
            for yi = y-d:y+d
                total += image[xi,yi]
            end
        end
        return total/((2d+1)^2)
    end
end

blurImg = [boxBlur(gImg,x,y,5) for x in 1:cols, y in 1:rows]

yOriginal, xOriginal = argmax(gImg).I
yBoxBlur, xBoxBlur   = argmax(blurImg).I

p1 = heatmap(gImg, c=:Greys, yflip=true)
p1 = scatter!((xOriginal, yOriginal), ms=60, ma=0, msw=4, msc=:red) 
p2 = heatmap(blurImg, c=:Greys, yflip=true)
p2 = scatter!((xBoxBlur, yBoxBlur), ms=60, ma=0, msw=4, msc=:red)

plot(p1, p2, size=(800, 400), ratio=:equal, xlims=(0,cols), ylims=(0,rows), 
    colorbar_entry=false, border=:none, legend=:none)

1个回答

3

ICartesianIndex 类型对象中的一个字段,当传入参数拥有多个维度时,argmax 方法返回该对象。

如果不确定,请尝试使用 dump

请参考以下代码:

julia> arr = rand(4,4)
4×4 Matrix{Float64}:
 0.971271  0.0350186  0.20805   0.284678
 0.348161  0.19649    0.30343   0.291894
 0.385583  0.990593   0.216894  0.814146
 0.283823  0.750008   0.266643  0.473104

julia> el = argmax(arr)
CartesianIndex(3, 2)

julia> dump(el)
CartesianIndex{2}
  I: Tuple{Int64, Int64}
    1: Int64 3
    2: Int64 2

然而,通过其内部结构获取CartesianIndex对象数据并不是很优雅。在Julia中完成此操作的好方法是使用适当的方法:

julia> Tuple(el)
(3, 2)

或者直接访问索引:

julia> el[1], el[2]
(3, 2)

我对元组类型不是很熟悉。根据定义,它是一个“有序且不可变”的序列。对我来说,元组是原始序列的有序版本。不仅如此,它还提供了位置标记,比如在argmax()中哪一个是最大值。太棒了!我觉得我现在有更好的理解了,感谢您的“dump”提示,非常感谢。 - Grec001

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接