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)
不需要额外的包,Julia Base 有这个:
_DAYS_IN_MONTH .- circshift(_DAYS_IN_MONTH,1)
Run Code Online (Sandbox Code Playgroud)