是否有与 NumPy 的省略号切片语法 (...) 等效的 Julia?

Posted

技术标签:

【中文标题】是否有与 NumPy 的省略号切片语法 (...) 等效的 Julia?【英文标题】:Is there a Julia equivalent to NumPy's ellipsis slicing syntax (...)? 【发布时间】:2015-07-21 11:51:04 【问题描述】:

在 NumPy 中,ellipsis syntax 用于

填写多个:,直到切片说明符的数量与数组的维度相匹配。

(转述this answer)。

我如何在 Julia 中做到这一点?

【问题讨论】:

【参考方案1】:

他们要走的路是EllipsisNotation.jl,它将.. 添加到语言中。

例子:

julia> using EllipsisNotation

julia> x = rand(1,2,3,4,5);

julia> x[..,3] == x[:,:,:,:,3]
true

julia> x[1,..] == x[1,:,:,:,:]
true

julia> x[1,1,..] == x[1,1,:,:,:]
true

(@mschauer 已经注意到他的答案(编辑),但参考在最后,我觉得这个问题应该得到一个干净的最新答案。)

【讨论】:

【参考方案2】:

还没有,但如果你愿意,你可以自己动手。

    import Base.getindex, Base.setindex!
    const .. = Val:...

    setindex!T(A::AbstractArrayT,1, x, ::TypeVal:..., n) = A[n] = x
    setindex!T(A::AbstractArrayT,2, x, ::TypeVal:..., n) = A[ :, n] = x
    setindex!T(A::AbstractArrayT,3, x, ::TypeVal:..., n) = A[ :, :, n] =x

    getindexT(A::AbstractArrayT,1, ::TypeVal:..., n) = A[n]
    getindexT(A::AbstractArrayT,2, ::TypeVal:..., n) = A[ :, n]
    getindexT(A::AbstractArrayT,3, ::TypeVal:..., n) = A[ :, :, n]

那你就可以写了

    > rand(3,3,3)[.., 1]
    3x3 ArrayFloat64,2:
     0.0750793  0.490528  0.273044
     0.470398   0.461376  0.01372 
     0.311559   0.879684  0.531157

如果您想要更精细的切片,您需要生成/扩展定义或使用分段函数。

编辑:如今,见https://github.com/ChrisRackauckas/EllipsisNotation.jl

【讨论】:

还有更多关于 github 问题的讨论(来自您):github.com/JuliaLang/julia/issues/5405

以上是关于是否有与 NumPy 的省略号切片语法 (...) 等效的 Julia?的主要内容,如果未能解决你的问题,请参考以下文章

只有整数、切片 (`:`)、省略号 (`...`)、numpy.newaxis (`None`) 和整数或布尔数组是有效的索引

RandomForest IndexError:只有整数、切片(`:`)、省略号(`...`)、numpy.newaxis(`None`)和整数或布尔数组是有效的索引

只有整数、切片 (`:`)、省略号 (`...`)、numpy.newaxis (`None`) 和整数或布尔数组是生成 rnn 的有效索引

Tensorflow 2 - tf.slice 及其 NumPy 切片语法不兼容的行为

字典中的 NumPy 切片符号

numpy 切片