Julia程序设计3 数组1 创建、初始化、属性与访问

Julia程序设计3 数组

  • 创建数组
  • 数组的属性
  • 访问数组中的元素

创建数组

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创建新数组,可以选择reshapecopysimilar方法:

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

数组的属性

Julia程序设计3 数组1 创建、初始化、属性与访问_第1张图片
前五个都比较好理解,这里解释一下后五个。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的第132×3 Array{Float64,2}:
 0.934257  0.728261  0.165961
 0.922818  0.251498  0.619831

julia> A[:,c] #访问A的第133×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

你可能感兴趣的:(数值分析,julia,算法)