你可以轻松地自己定义一个
head
函数。对于一维和二维,这相当简单:
torange(n::Integer, m) = 1:min(n, m)
torange(c::Colon, m) = (:)
function head(a::AbstractArray{TypeVar(:T), 1}, n = 10)
view(a, torange(n,size(a,1)))
end
function head(a::AbstractArray{TypeVar(:T), 2}, n1 = 10, n2 = 10)
view(a, torange(n1, size(a,1)), torange(n2, size(a,2)))
end
torange
方法允许使用:
返回相应维度的完整长度。例如:
head(zeros(10, 10), 5, :)
5×10 SubArray{Float64,2,Array{Float64,2},Tuple{UnitRange{Int64},Colon},false}:
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
对于两个以上的维度,我选择从第三个参数开始重复最后一个参数:
function head{Na, Nn}(a::AbstractArray{TypeVar(:T), Na}, n1 = 10, n2 = 10, ns::Vararg{TypeVar(:T), Nn} = 2)
nend = last(ns)
view(a, torange(n1, size(a,1)), torange(n2, size(a,2)), (torange(ns[i], size(a,i+2)) for i = 1:Nn)..., (torange(nend, size(a, i)) for i in Nn+3:Na)...)
end
例如:
head(rand(10, 10, 5, 5), 3, 3, 2)
3×3×2×2 SubArray{Float64,4,Array{Float64,4},Tuple{UnitRange{Int64},UnitRange{Int64},UnitRange{Int64},UnitRange{Int64}},false}:
[:, :, 1, 1] =
0.384724 0.7328 0.585211
0.738284 0.95145 0.362914
0.43928 0.94307 0.758541
[:, :, 2, 1] =
0.78603 0.588877 0.677201
0.559547 0.800559 0.488433
0.993593 0.691884 0.236595
[:, :, 1, 2] =
0.25732 0.90491 0.323905
0.300924 0.703919 0.813316
0.040522 0.776142 0.624097
[:, :, 2, 2] =
0.746677 0.153574 0.155539
0.991624 0.90167 0.0880094
0.0423263 0.0153597 0.0608328
请注意,n维版本不是类型稳定的,但这对打印输出并不重要。
>=1.6
:first(x, 1)
是你的head
等价物,而last(x, 1)
则是你的tail
等价物。请参阅:https://docs.julialang.org/en/v1/base/collections/#Base.first - PatrickT