如何在 Julia 中模仿 Pythonic 数组索引

Jaf*_*rov 8 arrays indexing julia

我正在将代码从 Python 翻译为 Julia。我有以下数组:

_DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
Run Code Online (Sandbox Code Playgroud)

以及以下代码行:

_DAYS_IN_MONTH[index] - _DAYS_IN_MONTH[index - 1]
Run Code Online (Sandbox Code Playgroud)

这个想法是,如果index - 1计算结果为 -1,那么我们将获得数组的最后一个元素,这正是我们在本例中所需要的。然而,这在 Julia 中不起作用。当然,我可以写这样的东西:

if index == 1
    _DAYS_IN_MONTH[index] - _DAYS_IN_MONTH[end]
else
    _DAYS_IN_MONTH[index] - _DAYS_IN_MONTH[index - 1]
end
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有一种更优雅和“朱利安”的方式来做到这一点。

Mat*_* B. 12

实际上,您所追求的是圆形数组的一个非常特殊的情况。您可以通过mod1. 它将“环绕”有效索引之外的值。它需要两个参数;第一个是值(要换行的索引),第二个是模数(数组的长度)。在索引的上下文中,您可以使用特殊的end模数语法:

julia> [_DAYS_IN_MONTH[index] - _DAYS_IN_MONTH[mod1(index - 1, end)] for index in 1:12]
12-element Vector{Int64}:
  0
 -3
  3
 -1
  1
 -1
  1
  0
 -1
  1
 -1
  1
Run Code Online (Sandbox Code Playgroud)


Prz*_*fel 11

另一个优雅的选择是using CircularArrays

julia> _DAYS_IN_MONTH = CircularVector([31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]);

julia> _DAYS_IN_MONTH .- _DAYS_IN_MONTH[0:end-1]
12-element CircularVector(::Vector{Int64}):
  0
 -3
  3
 -1
  1
 -1
  1
  0
 -1
  1
 -1
  1
Run Code Online (Sandbox Code Playgroud)

或者using ShiftedArrays

julia> _DAYS_IN_MONTH .- circshift(_DAYS_IN_MONTH,1)
12-element Vector{Int64}:
  0
 -3
  3
 -1
  1
 -1
  1
  0
 -1
  1
 -1
  1
Run Code Online (Sandbox Code Playgroud)


هنر*_*تان 5

不需要额外的包,Julia Base 有这个:

_DAYS_IN_MONTH .- circshift(_DAYS_IN_MONTH,1)
Run Code Online (Sandbox Code Playgroud)