在 Julia 中定义任意维度的多维数组
Defining a multiple-dimensional array of arbitrary dimension in Julia
上下文
此问题与this one有关。
在 Julia 中,我想制作一个 5 x 5 的二维数组,其中 (i, j) 元素具有 [i,j]
,如下所示:
5×5 Matrix{Vector{Int64}}:
[1, 1] [1, 2] [1, 3] [1, 4] [1, 5]
[2, 1] [2, 2] [2, 3] [2, 4] [2, 5]
[3, 1] [3, 2] [3, 3] [3, 4] [3, 5]
[4, 1] [4, 2] [4, 3] [4, 4] [4, 5]
[5, 1] [5, 2] [5, 3] [5, 4] [5, 5]
我尝试使用 array comprehension:
N = 5
L_2 = [[x1,x2] for x1 = 1:N, x2 = 1:N]
我想做什么
我想将此定义概括为任意维度 D
。
L_1 = [[x1] for x1 = 1:N] # 1-dimensional
L_2 = [[x1,x2] for x1 = 1:N, x2 = 1:N] # 2-dimensional
L_3 = [[x1,x2,x3] for x1 = 1:N, x2 = 1:N,x3 = 1:N] # 3-dimensional
...
#L_D = ??? # D-dimensional
如何定义?
不用数组推导也可以
如有任何信息,我们将不胜感激。
您可以概括我在其他答案中发布的 vcat
方法,如下所示:
julia> lattice(N, D) = vcat.((reshape(1:N, ntuple(j -> j == i ? N : 1, D)) for i in 1:D)...)
lattice (generic function with 1 method)
julia> lattice(2, 1)
2-element Vector{Vector{Int64}}:
[1]
[2]
julia> lattice(2, 2)
2×2 Matrix{Vector{Int64}}:
[1, 1] [1, 2]
[2, 1] [2, 2]
julia> lattice(2, 3)
2×2×2 Array{Vector{Int64}, 3}:
[:, :, 1] =
[1, 1, 1] [1, 2, 1]
[2, 1, 1] [2, 2, 1]
[:, :, 2] =
[1, 1, 2] [1, 2, 2]
[2, 1, 2] [2, 2, 2]
julia> lattice(2, 4)
2×2×2×2 Array{Vector{Int64}, 4}:
[:, :, 1, 1] =
[1, 1, 1, 1] [1, 2, 1, 1]
[2, 1, 1, 1] [2, 2, 1, 1]
[:, :, 2, 1] =
[1, 1, 2, 1] [1, 2, 2, 1]
[2, 1, 2, 1] [2, 2, 2, 1]
[:, :, 1, 2] =
[1, 1, 1, 2] [1, 2, 1, 2]
[2, 1, 1, 2] [2, 2, 1, 2]
[:, :, 2, 2] =
[1, 1, 2, 2] [1, 2, 2, 2]
[2, 1, 2, 2] [2, 2, 2, 2]
julia> lattice(2, 5)
2×2×2×2×2 Array{Vector{Int64}, 5}:
[:, :, 1, 1, 1] =
[1, 1, 1, 1, 1] [1, 2, 1, 1, 1]
[2, 1, 1, 1, 1] [2, 2, 1, 1, 1]
[:, :, 2, 1, 1] =
[1, 1, 2, 1, 1] [1, 2, 2, 1, 1]
[2, 1, 2, 1, 1] [2, 2, 2, 1, 1]
[:, :, 1, 2, 1] =
[1, 1, 1, 2, 1] [1, 2, 1, 2, 1]
[2, 1, 1, 2, 1] [2, 2, 1, 2, 1]
[:, :, 2, 2, 1] =
[1, 1, 2, 2, 1] [1, 2, 2, 2, 1]
[2, 1, 2, 2, 1] [2, 2, 2, 2, 1]
[:, :, 1, 1, 2] =
[1, 1, 1, 1, 2] [1, 2, 1, 1, 2]
[2, 1, 1, 1, 2] [2, 2, 1, 1, 2]
[:, :, 2, 1, 2] =
[1, 1, 2, 1, 2] [1, 2, 2, 1, 2]
[2, 1, 2, 1, 2] [2, 2, 2, 1, 2]
[:, :, 1, 2, 2] =
[1, 1, 1, 2, 2] [1, 2, 1, 2, 2]
[2, 1, 1, 2, 2] [2, 2, 1, 2, 2]
[:, :, 2, 2, 2] =
[1, 1, 2, 2, 2] [1, 2, 2, 2, 2]
[2, 1, 2, 2, 2] [2, 2, 2, 2, 2]
您似乎不需要为此使用 CartesianIndices,但郑重声明,CartesianIndices 可以采用任何 Int 元组(更准确地说 Dims
又名 NTuple{N,Int} where N
)来表示数组的大小。 CartesianIndices((5,5))
表示 5x5,CartesianIndices((2,8,3))
表示 2x8x3,等等。您可以快速制作一个 NxNxNx... 表示具有 NtotheD(N,D) = ntuple(i -> N, D)
.
的 D 维大小的元组
上下文
此问题与this one有关。
在 Julia 中,我想制作一个 5 x 5 的二维数组,其中 (i, j) 元素具有 [i,j]
,如下所示:
5×5 Matrix{Vector{Int64}}:
[1, 1] [1, 2] [1, 3] [1, 4] [1, 5]
[2, 1] [2, 2] [2, 3] [2, 4] [2, 5]
[3, 1] [3, 2] [3, 3] [3, 4] [3, 5]
[4, 1] [4, 2] [4, 3] [4, 4] [4, 5]
[5, 1] [5, 2] [5, 3] [5, 4] [5, 5]
我尝试使用 array comprehension:
N = 5
L_2 = [[x1,x2] for x1 = 1:N, x2 = 1:N]
我想做什么
我想将此定义概括为任意维度 D
。
L_1 = [[x1] for x1 = 1:N] # 1-dimensional
L_2 = [[x1,x2] for x1 = 1:N, x2 = 1:N] # 2-dimensional
L_3 = [[x1,x2,x3] for x1 = 1:N, x2 = 1:N,x3 = 1:N] # 3-dimensional
...
#L_D = ??? # D-dimensional
如何定义?
不用数组推导也可以
如有任何信息,我们将不胜感激。
您可以概括我在其他答案中发布的 vcat
方法,如下所示:
julia> lattice(N, D) = vcat.((reshape(1:N, ntuple(j -> j == i ? N : 1, D)) for i in 1:D)...)
lattice (generic function with 1 method)
julia> lattice(2, 1)
2-element Vector{Vector{Int64}}:
[1]
[2]
julia> lattice(2, 2)
2×2 Matrix{Vector{Int64}}:
[1, 1] [1, 2]
[2, 1] [2, 2]
julia> lattice(2, 3)
2×2×2 Array{Vector{Int64}, 3}:
[:, :, 1] =
[1, 1, 1] [1, 2, 1]
[2, 1, 1] [2, 2, 1]
[:, :, 2] =
[1, 1, 2] [1, 2, 2]
[2, 1, 2] [2, 2, 2]
julia> lattice(2, 4)
2×2×2×2 Array{Vector{Int64}, 4}:
[:, :, 1, 1] =
[1, 1, 1, 1] [1, 2, 1, 1]
[2, 1, 1, 1] [2, 2, 1, 1]
[:, :, 2, 1] =
[1, 1, 2, 1] [1, 2, 2, 1]
[2, 1, 2, 1] [2, 2, 2, 1]
[:, :, 1, 2] =
[1, 1, 1, 2] [1, 2, 1, 2]
[2, 1, 1, 2] [2, 2, 1, 2]
[:, :, 2, 2] =
[1, 1, 2, 2] [1, 2, 2, 2]
[2, 1, 2, 2] [2, 2, 2, 2]
julia> lattice(2, 5)
2×2×2×2×2 Array{Vector{Int64}, 5}:
[:, :, 1, 1, 1] =
[1, 1, 1, 1, 1] [1, 2, 1, 1, 1]
[2, 1, 1, 1, 1] [2, 2, 1, 1, 1]
[:, :, 2, 1, 1] =
[1, 1, 2, 1, 1] [1, 2, 2, 1, 1]
[2, 1, 2, 1, 1] [2, 2, 2, 1, 1]
[:, :, 1, 2, 1] =
[1, 1, 1, 2, 1] [1, 2, 1, 2, 1]
[2, 1, 1, 2, 1] [2, 2, 1, 2, 1]
[:, :, 2, 2, 1] =
[1, 1, 2, 2, 1] [1, 2, 2, 2, 1]
[2, 1, 2, 2, 1] [2, 2, 2, 2, 1]
[:, :, 1, 1, 2] =
[1, 1, 1, 1, 2] [1, 2, 1, 1, 2]
[2, 1, 1, 1, 2] [2, 2, 1, 1, 2]
[:, :, 2, 1, 2] =
[1, 1, 2, 1, 2] [1, 2, 2, 1, 2]
[2, 1, 2, 1, 2] [2, 2, 2, 1, 2]
[:, :, 1, 2, 2] =
[1, 1, 1, 2, 2] [1, 2, 1, 2, 2]
[2, 1, 1, 2, 2] [2, 2, 1, 2, 2]
[:, :, 2, 2, 2] =
[1, 1, 2, 2, 2] [1, 2, 2, 2, 2]
[2, 1, 2, 2, 2] [2, 2, 2, 2, 2]
您似乎不需要为此使用 CartesianIndices,但郑重声明,CartesianIndices 可以采用任何 Int 元组(更准确地说 Dims
又名 NTuple{N,Int} where N
)来表示数组的大小。 CartesianIndices((5,5))
表示 5x5,CartesianIndices((2,8,3))
表示 2x8x3,等等。您可以快速制作一个 NxNxNx... 表示具有 NtotheD(N,D) = ntuple(i -> N, D)
.