我在理解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来索引数组可以,但是手动写索引却不行吗?
由于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[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
X = Float64; X [1 5 9]
。错误不是来自解析,只是关于缺少typed_hcat(T, ...)函数。但我无法定义适当的typed_hcat函数!为什么? - Lisotyped_hcat
是用于我上面展示的内容:第一个参数应该是结果数组的元素类型的数据类型。我相信这已经内置于核心Julia中,因为它对于数组构建具有特殊的解析和处理能力。 - Chris RackauckasBase.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