如何对Julia数组进行索引

6

我在理解Julia时遇到了一些不一致的行为问题。

X = reshape(1:100, 10, 10)
b = [1 5 9]
X[2, :][b] # returns the correct array
X[2, :][1 5 9] # throws an error

有人能解释一下为什么使用变量b来索引数组可以,但是手动写索引却不行吗?
2个回答

10

由于x = X [2,:]只是一个向量,因此我们可以简化示例,仅谈论向量上的索引行为。

x [v],其中v是整数集合,返回x的子集。因此x [(1,5,9)]x [[1,5,9]]正是使用getindex(x :: Vector,i :: AbstractArray)分派。

请注意,x [[1 5 9]]之所以起作用,是因为v = [1 5 9]v变为行向量。这是有效的语法,但x [1 5 9]甚至不是有效的Julia语法。那种语法表示其他意思:

v = Float64[1 5 9]

返回一个元素类型为Float64的行向量。


很有趣-看起来语法是有效的,因为你可以这样做:X = Float64; X [1 5 9]。错误不是来自解析,只是关于缺少typed_hcat(T, ...)函数。但我无法定义适当的typed_hcat函数!为什么? - Liso
这是因为typed_hcat是用于我上面展示的内容:第一个参数应该是结果数组的元素类型的数据类型。我相信这已经内置于核心Julia中,因为它对于数组构建具有特殊的解析和处理能力。 - Chris Rackauckas
2
@Liso:尝试使用Base.typed_hcat(::AbstractArray, ::Int...) = "不要这样做!" - mbauman
我觉得有趣的是,(1:10)[[1 4]](1:10)[[1, 4]]的结果类型不同。我想知道这是否有一个有效的原因,还是只是两者发展历史的遗留问题。 - Tasos Papastylianou
你使用 (1:10)[[1, 4]] 丢失了维度。尝试使用 (1:10)[[1, 4],:] 或者 (1:10)[[1, 4],:].'(或者 reshape((1:10)[[1, 4]], (2,1)))来解决问题。 - Liso

3

我想到了一个解决方案。

我应该写x[2,:][[1,5,9]],而不是写X[2,:][1,5,9]

当我们第二次在两个维度上进行索引时,我认为这是有意义的。这使得我们可以编写更复杂的索引,例如X[2:4,:][[1,3],[1,3]]


只要你明白 X[2:4, :][[1 3],[1 3]] 返回的是4个元素而不是2个(如果你是从Python过来的话,这可能是你期望的)。 - Tasos Papastylianou

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