Julia程序设计3 数组2 排序、复制、集合运算、字典
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(nlnn)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 排序、复制、集合运算、字典相关推荐
- Julia程序设计3 数组1 创建、初始化、属性与访问
Julia程序设计3 数组 创建数组 数组的属性 访问数组中的元素 创建数组 1.按列创建数组:如果用中括号创建数组.元素之间用逗号隔开,创建出来的数组就是列向量的形式:用中括号也可以按列创建多维数组 ...
- python集合排序_numpy排序与集合运算用法示例
排序 numpy与python列表内置的方法类似,也可通过sort方法进行排序. 用法如下: In [1]: import numpy as np In [2]: x = np.random.rand ...
- java对数组进行排序
通过Arrays类的静态sort()方法可以实现对数组的排序.sort()方法提供了多种重载形式,可对任意类型的数组进行升序排序. import java.util.Arrays; public cl ...
- python 字符串去重从小到大排列_python 序列(字符串、字符串、元组、集合、字典)...
运行环境:python3.8 Anaconda 字符串 在python中,单个字符就是字符串. 字符串不可改变,使用单引号' ',双引号" ",三引号'" "' ...
- Java_数组(声明、创建、初始化、复制、增强型for循环、二维数组、排序、Arrays类)
Java_数组 数组的基本概念 声明数组 创建数组 初始化数组 方法一:分配空间与赋值分步进行 方法二:分配空间,同时赋值 增强型for循环 复制数组 二维数组 排序 Arrays类 copyOfRa ...
- Java数组中文排序_Java模块 -- 数组/集合中文汉字排序(支持生僻汉字)
这里举例List集合 , 对list中的中文进行排序 , 按照中文拼音首字母. 支持生僻汉字的话 , 需要使用一个jar包 , 链接地址如下 传统的 : List list = new ArrayLi ...
- 利用集合进行数组的排序
笔者在学习VB中发现利用集合可以进行排序,优化后比冒泡法快得多.下面是完整的函数代码,演示了如何进行数组的升序或降序排列. Option Explicit Dim X(100) As Double D ...
- c语言中一个整型数组结束用 0表示吗,C语言程序设计0数组.ppt
C语言程序设计0数组 第七章 数 组 数组的定义:是有序数据的集合. 数组的特点:数组中的每个元素都属于同一数据类型. 数组的访问:我们用一个统一的数组名和下标来唯一地确定数组中的元素. 7.1 一维 ...
- python实现单链表快速排序升序linkedqueue_同时对多个数组进行排序
关于 同时对多个数组进行排序的搜索结果 回答 本人学习数据结构时看到的不错的总结,共享一下了 文件有一组记录组成,记录有若干数据项组成,唯一标识记录的数据项称关键字; 排序是将文件按关键字的递增(减) ...
最新文章
- java 正则 捕获_Java通过正则表达式捕获组中的文本
- mybatis中useGeneratedKeys用法--插入数据库后获取主键值
- 大学计算机基础课程报告python-基于Python的“大学计算机基础”课程教学设计.doc...
- 解决Docker上安装RabbitMQ后Web管理页面打不开的问题
- linux 操作系统中的谷歌浏览器google chrome打不开怎么解决
- 我的Go+语言初体验--Go+之环境安装与程序编码初体验
- 贷款时,如何评估借款人的还款意愿
- B. Trouble Sort Codeforces Round #648 (Div. 2)
- update怎么同时改两个字段_[NewLife.XCode]高级增删改
- WCF元数据交互及其序列化
- python 爬虫之路教程
- C语言-扫雷游戏程序设计
- Kafka(四).KafkaJAVA 基础API
- C stdlib.h
- JS day_08(5.17)String 、 Math
- 【ROSE】1. Rational Rose简介
- Hexo-yilia主题个性化美化及功能添加
- 搞机攻略(Android Root iOS越狱)
- 【pandas之数据清洗和处理和空值处理】
- CSS样式中字体大小,建议font-size使用em
热门文章
- Matlab安装有限元FEM工具箱
- 适合vue的富文本框
- Java游戏编程前篇 修改eclipse背景颜色
- JavaScript 技术篇-textContent获取dom节点text文本内容带空格,js获取带空格的dom节点内容
- Python+selenium 自动化-调用dom节点的click()监听事件,强力操作节点,穿透元素进行点击,节点被遮挡不可点击解决方法
- 批量修改编码格式小工具
- SSD算法 模板 匹配
- Pytorch预训练模型下载并加载(以VGG为例)自定义路径
- OpenMP在Windows下用VS使用
- 拉格朗日插值--等距节点Python实现并计算误差