julia> m=rand(1:10,3,4)
3×4 Array{Int64,2}:
4 5 3 9
6 8 1 5
4 5 3 4
julia> m[[1],:]
1×4 Array{Int64,2}:
4 5 3 9
请注意,最好使用views 来避免数据复制:
julia> @view m[[1],:]
1×4 view(::Array{Int64,2}, [1], :) with eltype Int64:
4 5 3 9
说明:
Array 元素的选择可以通过使用标量或使用迭代来完成。使用标量会导致给定维度被删除。另一方面,使用集合不会删除维度。为了更好地解释,请考虑另一个示例:
julia> m[1:1,1:1]
1×1 Array{Int64,2}:
4
您可以看到只选择了一个元素,但维度没有被删除。因此,您最终拥有一个只有一行和一列的Matrix(即二维Array)。
编辑(Colin T Bowers 评论 - 谢谢!)
决定是否使用视图并不是琐事——主要是你的代码是否从缓冲中受益。然而,令人惊讶的是,views 通常会更好。
julia> const vals = rand(200,200);
julia> using BenchmarkTools
julia> @btime sum(view(vals,1,:))
169.392 ns (1 allocation: 48 bytes)
95.08924081258299
julia> @btime sum(vals[1,:])
184.384 ns (1 allocation: 1.77 KiB)
95.08924081258299
让我们定义自己的求和函数。
julia> function mysum(a::AbstractVector{A}) where A <: Number
v = zero(A)
@inbounds @simd for i in 1:length(a)
v += a[i]
end
v
end;
julia> @btime mysum(view(vals,1,:))
141.931 ns (0 allocations: 0 bytes)
95.08924081258299
julia> @btime mysum(vals[1,:])
174.934 ns (1 allocation: 1.77 KiB)
95.08924081258297
可以清楚地看到,当你对行求和一次时,views 仍然更好。
最后但并非最不重要的一点是,按列求和当然要快几倍,而且复制数据非常昂贵:
julia> @btime sum(view(vals,:,1))
25.828 ns (1 allocation: 48 bytes)
96.04440265541243
julia> @btime mysum(view(vals,:,1))
13.927 ns (0 allocations: 0 bytes)
96.04440265541243
julia> @btime sum(vals[:,1])
167.745 ns (1 allocation: 1.77 KiB)
96.04440265541243