为什么矩阵不能在 Julia 中索引向量

Why matrices cannot index vectors in Julia

TL;DR:我试图理解为什么 Matrixes 无法在 Julia 中索引 Vector 对象。显然,向量可以索引矩阵(见下文),但反过来是不合法的。我想了解这种行为,因为 (1) 我不明白为什么会发生这种情况,并且 (2) 我认为这是在防止程序员把事情搞砸,但我看不出这种行为在保护程序员免受什么。非常感谢。


考虑以下 arrays

julia> x_vector = [3 ; 2  ; 1]
3-element Vector{Int64}:
 3
 2
 1

julia> x_matrix = [3 ; 2  ; 1;;]
3×1 Matrix{Int64}:
 3
 2
 1

julia> y_vector = [1 ,0 ,0]
3-element Vector{Int64}:
 1
 0
 0

julia> y_matrix = [1; 0; 0;;]
3×1 Matrix{Int64}:
 1
 0
 0

现在,我将使用 y 数组索引 x 数组,选择 y 数组中包含 1 的值。

下面我列出了一些简单的情况(即矩阵索引矩阵和向量索引向量)

julia> x_matrix[isone.(y_matrix)]
1-element Vector{Int64}:
 3

julia> x_matrix[isone.(y_vector)]
1-element Vector{Int64}:
 3

显然,我可以使用向量来索引矩阵。

julia> x_matrix[isone.(y_vector)]
1-element Vector{Int64}:
 3

但是,我不能使用矩阵来索引向量,即使它们具有相同的维度(是吗?)。

x_vector[isone.(y_matrix)]

ERROR: BoundsError: attempt to access 3-element Vector{Int64} at index [3×1 BitMatrix]
Stacktrace:
 [1] throw_boundserror(A::Vector{Int64}, I::Tuple{Base.LogicalIndex{Int64, BitMatrix}})
   @ Base .\abstractarray.jl:691
 [2] checkbounds
   @ .\abstractarray.jl:656 [inlined]
 [3] _getindex
   @ .\multidimensional.jl:838 [inlined]
 [4] getindex(A::Vector{Int64}, I::BitMatrix)
   @ Base .\abstractarray.jl:1218
 [5] top-level scope
   @ C:\Users\index_matrix_vector.jl:34
 [6] eval
   @ .\boot.jl:373 [inlined]

如果您使用整数索引,则允许将矩阵传递给索引:

julia> a = [1, 2, 3]
3-element Vector{Int64}:
 1
 2
 3

julia> m = [1 2
            3 1]
2×2 Matrix{Int64}:
 1  2
 3  1

julia> a[m]
2×2 Matrix{Int64}:
 1  2
 3  1

但是,在您的示例中,您使用了 Bool 索引,这是一个特殊的索引,因为您可以在 https://docs.julialang.org/en/v1/manual/arrays/#Logical-indexing.

中签入

如您所见:

A logical index must be a vector of the same length as the dimension it indexes into, or it must be the only index provided and match the size and dimensionality of the array it indexes into.

此限​​制符合您所指示的逻辑 - 这是为了安全起见。 现在您可能会问,为什么对于更高维的数组,向量和数组索引都被允许。

我对原因的理解是,这在概念上匹配了 Julia 中允许索引数组的两种方式:

  • 线性索引(索引时传递一个数字)- 在您的情况下,这映射到使用 Bool 向量的索引
  • 正常索引(您传递的索引与数组中的维数一样多)- 这与索引映射到 Bool 的数组,其形状与索引数组的形状匹配。您可以 - 正如文档所述,分别为数组的每个维度传递一个 Bool 索引向量