Julia程序设计3 数组2 排序、复制、集合运算、字典
Julia程序設(shè)計3 數(shù)組2 排序、復(fù)制、集合運算、字典
- 排序
- 排序算法
- 查找數(shù)組中的元素
- 復(fù)制數(shù)組
- for語句實現(xiàn)數(shù)組的變換與生成
- 集合運算
- 字典
- 創(chuàng)建字典
- 查閱字典
- 查看索引
- 修改字典
- 添加、刪除
排序
1、Julia中數(shù)組排序最基礎(chǔ)的函數(shù)是sort,它默認是從小到大排序,如果加上rev = true就是從大到小:
julia> a = [2,6,3,4,1,7,8,5] 8-element Array{Int64,1}:26341785julia> sort(a) 8-element Array{Int64,1}:12345678julia> sort(a, rev = true) 8-element Array{Int64,1}:876543212、用sortperm()可以返回按從小打到排列的元素的指標(biāo),比如a中1在第5位,2在第一位,那么sortperm就會返回5,1,。。。
julia> I = sortperm(a) 8-element Array{Int64,1}:51348267julia> a[I] # 將a中的元素按I的順序還原 8-element Array{Int64,1}:123456783、sort中加上by = abs可以按絕對值從小到大排序,by = 和rev = 可以一起用;事實上 by = 可以接任何實值函數(shù),比如 by = sin,by = exp或者自定義函數(shù)
julia> b = [9,-3,0,4,-5] 5-element Array{Int64,1}:9-304-5julia> sort(b, by = abs) 5-element Array{Int64,1}:0-34-59julia> sort(b, by = abs, rev = true) 5-element Array{Int64,1}:9-54-30julia> sort(b, by = sin) 5-element Array{Int64,1}:4-309-54、多維數(shù)組排序需要指定維數(shù):
julia> A = [[1,4,3] [2,6,8] [4,4,7]] 3×3 Array{Int64,2}:1 2 44 6 43 8 7julia> sort(A, dims = 1) # 逐行排序 3×3 Array{Int64,2}:1 2 43 6 44 8 7julia> sort(A, dims = 2) # 逐列排序 3×3 Array{Int64,2}:1 2 44 4 63 7 8排序算法
Julia的默認排序方法是插入排序(insertion sort),快速排序(quick sort)和歸并排序(merge sort),后兩者分別是默認的數(shù)值與非數(shù)值元素的排序方法。插入排序復(fù)雜度是O(n2)O(n^2)O(n2),后兩者復(fù)雜度是O(nln?n)O(n\ln n)O(nlnn),但通常快速排序比歸并排序還要快一點。插入排序與歸并排序是穩(wěn)定的排序方法,但快速排序不穩(wěn)定,相等的元素可能有不同的排序。用alg = 可以選擇排序方法,@time 可以計時并記錄內(nèi)存分配:
julia> A = randn(Float64,10000); julia> @time sort(A;alg=InsertionSort)0.066310 seconds (94.03 k allocations: 4.919 MiB)julia> @time sort(A;alg=QuickSort);0.062647 seconds (93.39 k allocations: 4.804 MiB)julia> @time sort(A;alg=MergeSort);0.068424 seconds (85.44 k allocations: 4.495 MiB)時間上最優(yōu)的是快速排序,但它需要的內(nèi)存比歸并排序多一點。
查找數(shù)組中的元素
1、用in判斷某個元素是否在數(shù)組中:
julia> A = [1,2,3,4] 4-element Array{Int64,1}:1234julia> B = [A A]; # B的數(shù)據(jù)類型是4×2 Array{Int64,2},是一個二維的數(shù)組 julia> C = [1,2]; # C是數(shù)組的切片A[1:2] julia> D = [A,A]; # D的數(shù)據(jù)類型是2-element Array{Array{Int64,1},1},即以數(shù)組為元素的數(shù)組julia> 1 in A # 判斷元素是否在數(shù)組中的兩種方法 true julia> in(1,A) truejulia> C in A # A的切片不是A的元素 falsejulia> A in B # 低維數(shù)組即使與高維數(shù)組某一維相同,它也不是高維數(shù)組的元素 falsejulia> A in D # 數(shù)組可以是以數(shù)組為元素的數(shù)組的元素 true2、查找數(shù)組中符合某種條件的元素,有findmin findmax findall findprev findnext findmin! findmax! findlast findfirst這些函數(shù)可以用,這里介紹前三種,其他的可以自己help
julia> A = [3,5,6,1,7,-2]julia> findmin(A) # 找最小值,返回值第一個是最小值,第二個是最小值的位置 (-2, 6)julia> findmax(A) # 找最大值,返回值第一個是最大值,第二個是最大值的位置 (7, 5)julia> findall(x->x>=0,A) # 找符合條件的元素,并返回元素的位置,x->表示尋找的元素滿足后面的條件 5-element Array{Int64,1}:12345復(fù)制數(shù)組
Julia中數(shù)組的復(fù)制有兩種形式:淺復(fù)制copy()和深復(fù)制deepcopy()。淺復(fù)制得到的新的數(shù)組會隨原來的數(shù)組的改變而改變,深復(fù)制得到的數(shù)組不會隨原來的數(shù)組的改變而改變:
julia> a = zeros(3,3) 3×3 Array{Float64,2}:0.0 0.0 0.00.0 0.0 0.00.0 0.0 0.0julia> b = [1,2,a] 3-element Array{Any,1}:12[0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]julia> c = copy(b); d = deepcopy(b); # c為淺復(fù)制,d為深復(fù)制julia> b[3][1]=10 # 改變b的值 10julia> b 3-element Array{Any,1}:12[10.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]julia> c # c的值隨之改變 3-element Array{Any,1}:12[10.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]julia> d # d的值不改變 3-element Array{Any,1}:12[0.0 0.0 0.0; 0.0 0.0 0.0; 0.0 0.0 0.0]for語句實現(xiàn)數(shù)組的變換與生成
在[]中用for語句可以實現(xiàn)對數(shù)組的變換:
julia> A = [1,2,3,4] 4-element Array{Int64,1}:1234julia> [A[i]^2 for i = 1:length(A)] # A中元素做平方運算,用A[i]表示A中元素 4-element Array{Int64,1}:14916julia> [sqrt(n) for n in A] # A中元素做開方變換,與上面的區(qū)別是元素表示方法不同,這里用n表示A中元素 4-element Array{Float64,1}: 1.01.41421356237309511.73205080756887722.0julia> [complex(A[i],A[i+1]) for i=1:length(A)-1] # 多元的,非實值的變換也可以 3-element Array{Complex{Int64},1}:1 + 2im2 + 3im3 + 4imjulia> Float64[0.5*A[i]+0.333*A[i+1] for i=2:length(A)-1] # 還可以指定變換后的數(shù)據(jù)類型以及參與變換的元素范圍 2-element Array{Float64,1}:1.9992.832julia> collect(x^y for x in 1:3,y in 1:3) # 配合其他函數(shù)還可以用來創(chuàng)建數(shù)組 3×3 Array{Int64,2}:1 1 12 4 83 9 27集合運算
集合的交并差在Julia中可以用union、intersect、setdiff來做:
julia> A = [1,2,3,4] 4-element Array{Int64,1}:1234julia> B = [3,3,3,3] 4-element Array{Int64,1}:3333julia> union(A,B) 4-element Array{Int64,1}:1234julia> intersect(A,B) 1-element Array{Int64,1}:3julia> setdiff(A,B) 3-element Array{Int64,1}:124julia> setdiff(B,A) 0-element Array{Int64,1}字典
字典可以理解成更一般的數(shù)組,數(shù)組體現(xiàn)的是從指標(biāo)(UInt64)到數(shù)組的元素(任意數(shù)據(jù)類型)的對應(yīng)關(guān)系,字典則用來描述更一般的數(shù)據(jù)類型之間的對應(yīng)關(guān)系。
創(chuàng)建字典
字典的創(chuàng)建用Dict()函數(shù),a=>b表示從a到b的對應(yīng)關(guān)系,a是索引,b是字,一個字可以有多個索引,但一個索引只對應(yīng)一個字;如果Dict()中不列舉對應(yīng)關(guān)系,創(chuàng)建的就是空字典;字典的數(shù)據(jù)類型由對應(yīng)的數(shù)據(jù)類型決定:
julia> Dict("red"=>1,"blue"=>2,"green"=>3) Dict{String,Int64} with 3 entries:"blue" => 2"green" => 3"red" => 1julia> Dict("red"=>"Red","blue"=>"Red","green"=>"Green") Dict{String,String} with 3 entries:"blue" => "Red""green" => "Green""red" => "Red"julia> Dict{Integer,String}() Dict{Integer,String} with 0 entriesjulia> Dict() Dict{Any,Any} with 0 entries查閱字典
julia> dict = Dict('r'=>"Red",'b'=>"Blue",'g'=>"Green") Dict{Char,String} with 3 entries:'g' => "Green"'r' => "Red"'b' => "Blue"julia> dict['r'] "Red"查看索引
julia> dict = Dict('r'=>"Red",'b'=>"Blue",'g'=>"Green") Dict{Char,String} with 3 entries:'g' => "Green"'r' => "Red"'b' => "Blue"julia> keys(dict) # 查看索引 Base.KeySet for a Dict{Char,String} with 3 entries. Keys:'g''r''b'julia> values(dict) # 查看字 Base.ValueIterator for a Dict{Char,String} with 3 entries. Values:"Green""Red""Blue"修改字典
julia> dict = Dict('r'=>"Red",'b'=>"Blue",'g'=>"Green") Dict{Char,String} with 3 entries:'g' => "Green"'r' => "Red"'b' => "Blue"julia> dict['b']="Black" "Black"julia> dict Dict{Char,String} with 3 entries:'g' => "Green"'r' => "Red"'b' => "Black"添加、刪除
julia> dict = Dict('r'=>"Red",'b'=>"Blue",'g'=>"Green") Dict{Char,String} with 3 entries:'g' => "Green"'r' => "Red"'b' => "Blue"julia> dict['o'] ="Orange" # 把字賦值給新的索引就是添加新的對應(yīng) "Orange"julia> dict Dict{Char,String} with 4 entries:'g' => "Green"'r' => "Red"'o' => "Orange"'b' => "Blue"julia> delete!(dict,'o') # 刪除某個索引就可以刪除一個對應(yīng) Dict{Char,String} with 3 entries:'g' => "Green"'r' => "Red"'b' => "Blue" 《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Julia程序设计3 数组2 排序、复制、集合运算、字典的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Julia程序设计3 数组1 创建、初始
- 下一篇: UA MATH571B 试验设计VI 随