切片多维Julia数组不对称

切片多维Julia数组不对称,julia,Julia,采用以下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 vs: 有人能解释一下这是怎么回事吗?我来自numpy/MATLAB背景,这种行为对我来说非常奇怪。目前,Julia在切片时会删除尾随的奇

采用以下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
vs:


有人能解释一下这是怎么回事吗?我来自numpy/MATLAB背景,这种行为对我来说非常奇怪。

目前,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具有标量值和一维向量,因此它不是一般的nd矩阵类型。我不认为你是第一个被这个财产弄糊涂的人。我记得有人建议删除所有奇异维度,并要求您执行
a[1: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中,在索引时添加额外的
1
s不是错误;即使
b
是二维对象,您仍然可以编写
b[2,2,1]

最后,如果你想要一些更像麻木的东西,考虑(在朱丽亚)使用<代码>切片< /> >:

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

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

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

谢谢。我喜欢Julia,但以矩阵为中心的特性和令人困惑的数组切片(与numpy相比)让我有些反感。
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