Julia程序设计3 数组2 排序、复制、集合运算、字典

  • 排序
    • 排序算法
  • 查找数组中的元素
  • 复制数组
  • for语句实现数组的变换与生成
  • 集合运算
  • 字典
    • 创建字典
    • 查阅字典
    • 查看索引
    • 修改字典
    • 添加、删除

排序

1、Julia中数组排序最基础的函数是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}:87654321

2、用sortperm()可以返回按从小打到排列的元素的指标,比如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}:12345678

3、sort中加上by = abs可以按绝对值从小到大排序,by = 和rev = 可以一起用;事实上 by = 可以接任何实值函数,比如 by = sin,by = exp或者自定义函数

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-5

4、多维数组排序需要指定维数:

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),后两者分别是默认的数值与非数值元素的排序方法。插入排序复杂度是O(n2)O(n^2)O(n2),后两者复杂度是O(nln⁡n)O(n\ln n)O(nlnn),但通常快速排序比归并排序还要快一点。插入排序与归并排序是稳定的排序方法,但快速排序不稳定,相等的元素可能有不同的排序。用alg = 可以选择排序方法,@time 可以计时并记录内存分配:

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)

时间上最优的是快速排序,但它需要的内存比归并排序多一点。

查找数组中的元素

1、用in判断某个元素是否在数组中:

julia> A = [1,2,3,4]
4-element Array{Int64,1}:1234julia> B = [A A]; # B的数据类型是4×2 Array{Int64,2},是一个二维的数组
julia> C = [1,2]; # C是数组的切片A[1:2]
julia> D = [A,A]; # D的数据类型是2-element Array{Array{Int64,1},1},即以数组为元素的数组julia> 1 in A # 判断元素是否在数组中的两种方法
true
julia> in(1,A)
truejulia> C in A # A的切片不是A的元素
falsejulia> A in B # 低维数组即使与高维数组某一维相同,它也不是高维数组的元素
falsejulia> A in D # 数组可以是以数组为元素的数组的元素
true

2、查找数组中符合某种条件的元素,有findmin findmax findall findprev findnext findmin! findmax! findlast findfirst这些函数可以用,这里介绍前三种,其他的可以自己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

复制数组

Julia中数组的复制有两种形式:浅复制copy()和深复制deepcopy()。浅复制得到的新的数组会随原来的数组的改变而改变,深复制得到的数组不会随原来的数组的改变而改变:

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为浅复制,d为深复制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语句实现数组的变换与生成

在[]中用for语句可以实现对数组的变换:

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中元素做开方变换,与上面的区别是元素表示方法不同,这里用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] # 还可以指定变换后的数据类型以及参与变换的元素范围
2-element Array{Float64,1}:1.9992.832julia> collect(x^y for x in 1:3,y in 1:3) # 配合其他函数还可以用来创建数组
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}

字典

字典可以理解成更一般的数组,数组体现的是从指标(UInt64)到数组的元素(任意数据类型)的对应关系,字典则用来描述更一般的数据类型之间的对应关系。

创建字典

字典的创建用Dict()函数,a=>b表示从a到b的对应关系,a是索引,b是字,一个字可以有多个索引,但一个索引只对应一个字;如果Dict()中不列举对应关系,创建的就是空字典;字典的数据类型由对应的数据类型决定:

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" # 把字赋值给新的索引就是添加新的对应
"Orange"julia> dict
Dict{Char,String} with 4 entries:'g' => "Green"'r' => "Red"'o' => "Orange"'b' => "Blue"julia> delete!(dict,'o') # 删除某个索引就可以删除一个对应
Dict{Char,String} with 3 entries:'g' => "Green"'r' => "Red"'b' => "Blue"

Julia程序设计3 数组2 排序、复制、集合运算、字典相关推荐

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

    Julia程序设计3 数组 创建数组 数组的属性 访问数组中的元素 创建数组 1.按列创建数组:如果用中括号创建数组.元素之间用逗号隔开,创建出来的数组就是列向量的形式:用中括号也可以按列创建多维数组 ...

  2. python集合排序_numpy排序与集合运算用法示例

    排序 numpy与python列表内置的方法类似,也可通过sort方法进行排序. 用法如下: In [1]: import numpy as np In [2]: x = np.random.rand ...

  3. java对数组进行排序

    通过Arrays类的静态sort()方法可以实现对数组的排序.sort()方法提供了多种重载形式,可对任意类型的数组进行升序排序. import java.util.Arrays; public cl ...

  4. python 字符串去重从小到大排列_python 序列(字符串、字符串、元组、集合、字典)...

    运行环境:python3.8 Anaconda 字符串 在python中,单个字符就是字符串. 字符串不可改变,使用单引号' ',双引号" ",三引号'" "' ...

  5. Java_数组(声明、创建、初始化、复制、增强型for循环、二维数组、排序、Arrays类)

    Java_数组 数组的基本概念 声明数组 创建数组 初始化数组 方法一:分配空间与赋值分步进行 方法二:分配空间,同时赋值 增强型for循环 复制数组 二维数组 排序 Arrays类 copyOfRa ...

  6. Java数组中文排序_Java模块 -- 数组/集合中文汉字排序(支持生僻汉字)

    这里举例List集合 , 对list中的中文进行排序 , 按照中文拼音首字母. 支持生僻汉字的话 , 需要使用一个jar包 , 链接地址如下 传统的 : List list = new ArrayLi ...

  7. 利用集合进行数组的排序

    笔者在学习VB中发现利用集合可以进行排序,优化后比冒泡法快得多.下面是完整的函数代码,演示了如何进行数组的升序或降序排列. Option Explicit Dim X(100) As Double D ...

  8. c语言中一个整型数组结束用 0表示吗,C语言程序设计0数组.ppt

    C语言程序设计0数组 第七章 数 组 数组的定义:是有序数据的集合. 数组的特点:数组中的每个元素都属于同一数据类型. 数组的访问:我们用一个统一的数组名和下标来唯一地确定数组中的元素. 7.1 一维 ...

  9. python实现单链表快速排序升序linkedqueue_同时对多个数组进行排序

    关于 同时对多个数组进行排序的搜索结果 回答 本人学习数据结构时看到的不错的总结,共享一下了 文件有一组记录组成,记录有若干数据项组成,唯一标识记录的数据项称关键字; 排序是将文件按关键字的递增(减) ...

最新文章

  1. java 正则 捕获_Java通过正则表达式捕获组中的文本
  2. mybatis中useGeneratedKeys用法--插入数据库后获取主键值
  3. 大学计算机基础课程报告python-基于Python的“大学计算机基础”课程教学设计.doc...
  4. 解决Docker上安装RabbitMQ后Web管理页面打不开的问题
  5. linux 操作系统中的谷歌浏览器google chrome打不开怎么解决
  6. 我的Go+语言初体验--Go+之环境安装与程序编码初体验
  7. 贷款时,如何评估借款人的还款意愿
  8. B. Trouble Sort Codeforces Round #648 (Div. 2)
  9. update怎么同时改两个字段_[NewLife.XCode]高级增删改
  10. WCF元数据交互及其序列化
  11. python 爬虫之路教程
  12. C语言-扫雷游戏程序设计
  13. Kafka(四).KafkaJAVA 基础API
  14. C stdlib.h
  15. JS day_08(5.17)String 、 Math
  16. 【ROSE】1. Rational Rose简介
  17. Hexo-yilia主题个性化美化及功能添加
  18. 搞机攻略(Android Root iOS越狱)
  19. 【pandas之数据清洗和处理和空值处理】
  20. CSS样式中字体大小,建议font-size使用em

热门文章

  1. Matlab安装有限元FEM工具箱
  2. 适合vue的富文本框
  3. Java游戏编程前篇 修改eclipse背景颜色
  4. JavaScript 技术篇-textContent获取dom节点text文本内容带空格,js获取带空格的dom节点内容
  5. Python+selenium 自动化-调用dom节点的click()监听事件,强力操作节点,穿透元素进行点击,节点被遮挡不可点击解决方法
  6. 批量修改编码格式小工具
  7. SSD算法 模板 匹配
  8. Pytorch预训练模型下载并加载(以VGG为例)自定义路径
  9. OpenMP在Windows下用VS使用
  10. 拉格朗日插值--等距节点Python实现并计算误差