1、按列创建数组:如果用中括号创建数组、元素之间用逗号隔开,创建出来的数组就是列向量的形式;用中括号也可以按列创建多维数组
julia> a = [1,2,3,4]
4-element Array{Int64,1}:
1
2
3
4
julia> b = [[1,2,3] [4,5,6] [7,8,9]]
3×3 Array{Int64,2}:
1 4 7
2 5 8
3 6 9
2、按行创建数组:如果用中括号创建数组、元素之间用空格隔开,创建出来的数组就是行向量的形式;
julia> b = [1 2 3 4]
1×4 Array{Int64,2}:
1 2 3 4
但这两种方法创建的数组维数是不同的,前一种是一维的后一种是二维的。用size()可以返回数组的行列数、ndims()返回数组的维数:
julia> size(a)
(4,)
julia> size(b)
(1, 4)
julia> ndims(a)
1
julia> ndims(b)
2
3、用Array{data_type, Number}(undef,Number)语句创建数组,Number需要是Int64,{}中的数字表示数组的维数,()中的数字表示数组的size,size和维数要统一,比如二维数组需要两个数字表示size,用这个语句创建的数组会自动用随机数填充:
julia> a = Array{Int16}(undef,3)
3-element Array{Int16,1}:
12
0
0
julia> a = Array{Int16,2}(undef,2,3)
2×3 Array{Int16,2}:
31712 0 -27632
5687 0 5264
4、用zeros(data_type, Number, Number)语句创建元素全为0的数组,数字表示数组的size;
用ones(data_type, Number, Number)语句创建元素全为0的数组,数字同样表示数组的size;
用trues( Number, Number)语句创建元素全为true的数组,数字表示数组的size,因为true是Bool型的,无需指定数据类型,类似的还有falses( Number, Number)语句
julia> b = zeros(Float64,3,3)
3×3 Array{Float64,2}:
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
julia> b1 = ones(Float64,3,3)
3×3 Array{Float64,2}:
1.0 1.0 1.0
1.0 1.0 1.0
1.0 1.0 1.0
julia> c1 = trues(3,3)
3×3 BitArray{2}:
1 1 1
1 1 1
1 1 1
julia> c2 = falses(3,3)
3×3 BitArray{2}:
0 0 0
0 0 0
0 0 0
5、用rand(data_type,Number,Number)可以创建[0,1)间的均匀分布的随机数组,数字表示数组的size;用randn(data_type,Number,Number)可以创建标准正态分布的随机数组,数字表示数组的size;
julia> d1 = rand(Float64,3,3)
3×3 Array{Float64,2}:
0.110029 0.772143 0.434626
0.821364 0.592196 0.645199
0.1322 0.433895 0.0889052
julia> d2 = randn(Float64,3,3)
3×3 Array{Float64,2}:
0.779424 1.00182 0.0407997
-1.65429 0.502965 -0.55426
1.35664 -1.0813 0.869116
6、用语句fill!(A,x)可以用某个值 x x x填充整个数组 A A A;用fill(x,Number,Number)语句可以创建一个所有值都是 x x x,Number决定size的数组;前者填充后数组的数据类型由 A A A决定,后者填充后数组的数据类型由 x x x决定
julia> e1 = fill!(d1,1)
3×3 Array{Float64,2}:
1.0 1.0 1.0
1.0 1.0 1.0
1.0 1.0 1.0
julia> e2 = fill(0,3,3)
3×3 Array{Int64,2}:
0 0 0
0 0 0
0 0 0
7、基于已有的数组 A A A创建新数组,可以选择reshape、copy、similar方法:
julia> A = randn(Float64,4,4)
4×4 Array{Float64,2}:
-0.380822 0.0876638 -0.560772 0.152027
-0.970889 -1.00651 1.78672 0.309796
0.802797 0.868499 -0.401544 1.23172
-0.423717 1.29024 1.45242 -0.703994
julia> B = copy(A)
4×4 Array{Float64,2}:
-0.380822 0.0876638 -0.560772 0.152027
-0.970889 -1.00651 1.78672 0.309796
0.802797 0.868499 -0.401544 1.23172
-0.423717 1.29024 1.45242 -0.703994
julia> reshape(A,8,2)
8×2 Array{Float64,2}:
-0.380822 -0.560772
-0.970889 1.78672
0.802797 -0.401544
-0.423717 1.45242
0.0876638 0.152027
-1.00651 0.309796
0.868499 1.23172
1.29024 -0.703994
julia> similar(A)
4×4 Array{Float64,2}:
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
copy方法比较简单,就是直接复制数组 A A A;similar方法是创建一个数值类型、维数、size与 A A A相同的未初始化的数组;reshape是把数组 A A A变成另外的形状,需要注意的是新的size下元素数目与 A A A要相同,否则会报错,另外就是reshape是把 A A A按列拉平然后按列填充到新的size的数组内的
julia> reshape(A,2,2)
ERROR: DimensionMismatch("new dimensions (2, 2) must be consistent with array size 16")
Stacktrace:
[1] (::Base.var"#throw_dmrsa#196")(::Tuple{Int64,Int64}, ::Int64) at .\reshapedarray.jl:41
[2] reshape at .\reshapedarray.jl:45 [inlined]
[3] reshape(::Array{Float64,2}, ::Int64, ::Int64) at .\reshapedarray.jl:116
[4] top-level scope at none:0
8、创建函数的数组:数组的元素并不一定是数值,也可以是函数,比如
julia> a = [sin,cos,tan]
3-element Array{Function,1}:
sin
cos
tan
julia> a[1](pi)
1.2246467991473532e-16
9、数组中的元素也不一定具有相同的类型,比如
julia> a = [sin,pi,2.2,4]
4-element Array{Any,1}:
sin
π
2.2
4
julia> a[1](a[2])
1.2246467991473532e-16
10、创建从 a a a到 b b b步长为 s s s的数组可以用collect(a:s:b),其中a\s\b可以不是整数;省略号可以代替collect函数,比如collect(a:s:b)语句可以用[a:s:b…]代替
julia> collect(1:2:9)
5-element Array{Int64,1}:
1
3
5
7
9
julia> collect(1.2:0.2:3.3)
11-element Array{Float64,1}:
1.2
1.4
1.6
1.8
2.0
2.2
2.4
2.6
2.8
3.0
3.2
julia> [1.2:0.2:3.3...]
11-element Array{Float64,1}:
1.2
1.4
1.6
1.8
2.0
2.2
2.4
2.6
2.8
3.0
3.2
前五个都比较好理解,这里解释一下后五个。axes方法是返回数组的指标特征,比如
julia> A = zeros(3,4)
3×4 Array{Float64,2}:
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
julia> axes(A)
(Base.OneTo(3), Base.OneTo(4))
julia> axes(A,1)
Base.OneTo(3)
julia> axes(A,2)
Base.OneTo(4)
数组A维数是2,size分别为3,4,Base.OneTo()表示指标是从1到括号内的数字,axes(A,1)返回Base.OneTo(3)表示A的行的指标是从1到3。eachindex也是返回数组的指标特征,但它是把数组元素按列排的指标,A有12个元素,所以指标是1到12
julia> eachindex(A)
Base.OneTo(12)
stride方法返回A某一维相邻元素的指标距离,比如A的每一行相邻两个元素指标差异为1,因此stride(A,1)=1;A的每一列相邻两个元素指标差异为列数减1,这里A的列数为4,因此stride(A,2)=3
julia> stride(A,2)
3
julia> stride(A,1)
1
julia> A = rand(Float64,3,3)
3×3 Array{Float64,2}:
0.934257 0.728261 0.165961
0.55983 0.681753 0.237082
0.922818 0.251498 0.619831
julia> A[1,2]
0.7282612277314509
julia> A[1:3,1] # 访问A的第一列
3-element Array{Float64,1}:
0.9342567217098787
0.5598298924631933
0.9228178819973683
julia> c = [1,3];
julia> A[c,:] #访问A的第1、3行
2×3 Array{Float64,2}:
0.934257 0.728261 0.165961
0.922818 0.251498 0.619831
julia> A[:,c] #访问A的第1、3列
3×2 Array{Float64,2}:
0.934257 0.165961
0.55983 0.237082
0.922818 0.619831
julia> A[end,1] #end用在某个维度表示该维度最后一个元素
0.9228178819973683
julia> A[end] #只有一个end表示按列拉平后的最后一个元素
0.6198311712639313
julia> A[end,end]
0.6198311712639313