2014-01-16 61 views
2

采取以下2x2x2的朱数组:切片多维朱莉娅阵列不是对称

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:

julia> a[:,1,:] 
2x1x2 Array{Int32,3}: 
[:, :, 1] = 
1 
2 

[:, :, 2] = 
2 
3 

有人可以解释这里发生了什么吗?我来自numpy/MATLAB背景,这种行为对我来说非常奇怪。

回答

2

当前朱莉娅在切片时会降低拖尾的奇异维度,并且它对于任何维度都一致。我认为这只是我在切片矩阵行 - 老虎钳时想要行向量(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的),朱有标量值和1d矢量所以,而不是只是一个一般的第二矩阵型。我不认为你是第一个被这个属性弄糊涂的人。我记得看到建议放弃所有奇异维度,并要求你做a[1:1,:]获得一个行向量,但我不确定这会更好。

+0

谢谢。我喜欢茱莉亚,但是以矩阵为中心的自然和令人困惑的阵列切片(与numpy相比)让我略微放弃了它。 –

4

如果你来自一个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 

在这两个朱莉娅和Matlab,这不是增加额外1■当一个错误你指数;即使b是2d对象,仍可以编写b[2,2,1]

最后,如果你想要的东西,更像numpy的多,考虑(在朱丽亚)使用slice

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 

你会得到一个SubArray回(阵列视图),其中有一些稍微不同属性,但从长远来看,很可能会由大多数索引操作返回。或者,如果您更喜欢数组,您可以拨打squeezereshape以获得您想要的结果,返回值为a[:,1,:]

2

这已经改变了与朱莉娅0.5。切片现在是“对称”和a[:,:,1] == a[:,1,:]。所有由标量索引的维度现在都被删除,并且一般来说,输出的维度是索引维度的总和。