【问题标题】:slicing multidimensional Julia arrays not symmetric切片多维 Julia 数组不对称
【发布时间】:2014-02-04 20:01:21
【问题描述】:

取以下 2x2x2 Julia 数组:

julia> a
2x2x2 Array{Int32,3}:
[:, :, 1] =
 1  3
 2  4

[:, :, 2] =
 2  4
 3  5

我惊讶地发现沿不同维度切片会产生非对称结果:

julia> a[:,:,1]
2x2 Array{Int32,2}:
 1  3
 2  4

对比:

julia> a[:,1,:]
2x1x2 Array{Int32,3}:
[:, :, 1] =
 1
 2

[:, :, 2] =
 2
 3

有人能解释一下这里发生了什么吗?我来自 numpy/MATLAB 背景,这种行为对我来说非常奇怪。

【问题讨论】:

    标签: julia


    【解决方案1】:

    如果您来自 Matlab 背景,这应该不会太令人惊讶,因为 Matlab 的工作方式相同:

    >> a = reshape(1:8, 2, 2, 2)
    
    a(:,:,1) =
    
         1     3
         2     4
    
    
    a(:,:,2) =
    
         5     7
         6     8
    
    >> b = a(:,:,1)
    
    b =
    
         1     3
         2     4
    
    >> ndims(b)
    
    ans =
    
         2
    
    >> c = a(:,1,:)
    
    c(:,:,1) =
    
         1
         2
    
    
    c(:,:,2) =
    
         5
         6
    
    >> ndims(c)
    
    ans =
    
         3
    

    在 Julia 和 Matlab 中,在索引时添加额外的 1s 不是错误;即使b 是二维对象,您仍然可以编写b[2,2,1]

    最后,如果您想要一些更像 numpy 的东西,请考虑(在 Julia 中)使用 slice

    julia> c = slice(a, :, 1, :)
    2x2 SubArray{Int64,2,Array{Int64,3},(Range1{Int64},Int64,Range1{Int64})}:
     1  5
     2  6
    
    julia> c = slice(a, :, 1:1, :)
    2x1x2 SubArray{Int64,3,Array{Int64,3},(Range1{Int64},Range1{Int64},Range1{Int64})}:
    [:, :, 1] =
     1
     2
    
    [:, :, 2] =
     5
     6
    

    您将得到一个SubArray 返回(一个数组视图),它具有一些稍微不同的属性,但从长远来看,大多数索引操作可能会返回。或者,如果您更喜欢数组,您可以在 a[:,1,:] 的返回值上调用 squeezereshape 以获得您想要的结果。

    【讨论】:

      【解决方案2】:

      目前 Julia 在切片时会丢弃尾随奇异维度,并且它对任何维度都一致。我认为这只是对矩阵行虎钳切片时我想要行向量 (1*n) 而不是常规向量 (n) 的概括。

      julia> a = [1 2; 3 4]
      2x2 Array{Int64,2}:
       1  2
       3  4
      
      julia> a[:,1]
      2-element Array{Int64,1}:
       1
       3
      
      julia> a[1,:]
      1x2 Array{Int64,2}:
       1  2 
      

      与 matlab(和部分 numpy)不同,Julia 具有标量值和 1d 向量,因此不仅仅是一般的 nd 矩阵类型。我不认为你是第一个对这个属性感到困惑的人。我记得看到建议删除所有奇异维度,并要求您执行 a[1:1,:] 以获得行向量,但我不确定这会更好。

      【讨论】:

      • 谢谢。我喜欢 Julia,但以矩阵为中心的性质和令人困惑的数组切片(与 numpy 相比)让我有些厌烦。
      【解决方案3】:

      现在 Julia 0.5 改变了这一点。切片现在是“对称的”和a[:,:,1] == a[:,1,:]。现在删除了由标量索引的所有维度,并且通常,输出的维度是索引维度的总和。

      【讨论】:

        猜你喜欢
        • 2015-05-17
        • 2013-06-21
        • 2020-05-03
        • 2021-11-23
        • 2014-08-25
        • 2016-02-20
        • 1970-01-01
        • 2013-02-01
        相关资源
        最近更新 更多