Julia 学习笔记(一):数组
个人向,只会记录一些需要注意的点。
前言
学习 Julia 已经有一段时间了,但是进步缓慢。这一方面是最近代码写得少,一方面是 Julia 学习资料少、中文资料更少,但也有我没做笔记的缘故导致学习效率不佳。
最近发现一份很不错的入门教程:Introducing_Julia,但是它的中文版本仍然有很多不足,就打算给它添加翻译和润色(zxj5470 完成了绝大部分翻译工作),顺便总结一份自己的笔记。
NOTE:Julia 的主要语言特征在于类型系统和多重派发,而主要的科学计算特征则是矩阵和整个标准库及生态圈。
一、数组
在 Julia 中,数组被用作列表(lists)、向量(vectors)、表(tables)和矩阵(matrices)。
1. 数组的创建
这里尤其需要注意的是数组构造的几种方法,以及它们的区别。
1.1 一维数组(vector/list)
julia> v = [1, 2, 3, 4] # 逗号分隔的语法用于创建一维数组
4-element Array{Int64,1}:
1
2
3
4
向量,指列向量,Julia 使用的是 Fortran Order,各种操作都是列优先于行的。(和 numpy 相反,numpy 是 C Order 的,行优先于列)
1.2. 二维数组(table/matrix)
julia> mat = [1 2 3 4] # 空格分隔的语法,用于创建二维数组(或称行向量)
1×4 Array{Int64,2}:
1 2 3 4
julia> [1 2; 3 4] # 分号和换行符(\n),用于分隔数组中不同的行
2×2 Array{Int64,2}:
1 2
3 4
空格对应函数 hcat,表示横向拼接各个矩阵/元素。
分号和换行对应函数 vcat,表示垂直拼接各个矩阵/元素。
下面的例子演示了拼接(空格)和单纯分隔各个元素(逗号)的区别:
julia> [1 2 [3 4] 5] # 用空格做横向拼接(或称水平拼接)
1×5 Array{Int64,2}:
1 2 3 4 5
julia> [1, 2, [3, 4], 5] # 用逗号分隔
4-element Array{Any,1}:
1
2
[3, 4]
5
能看到在拼接操作中,[3 4] 被“解开”了,而用逗号时,它的行为和 Python 的 list 一样(区别只是 Julia 的 list 列优先)。
使用拼接需要注意的情况举例:
julia> [1 2 [3, 4] 5] # 横向拼接要求 items 的行数相同!
ERROR: DimensionMismatch("mismatch in dimension 1 (expected 1 got 2)")
因为 [3, 4] 有两行,而 数组中的其他项是数值,显然行数不同,所以抛出了 Error.
可以想见,垂直拼接则要求 items 的列数相同。
另外当垂直拼接用于基本元素时,效果等同于逗号。(结果都是单列数组)
julia> v = [1, 2, 3, 4]
4-element Array{Int64,1}:
1
2
3
4
julia> h = [1; 2; 3; 4]
4-element Array{Int64,1}:
1
2
3
4
julia> [[1; 2]; [3, 4]] # 等价于 [[1, 2]; [3, 4]]
4-element Array{Int64,1}:
1
2
3
4
2. 数组的索引
数组的索引方式和 numpy 很类似。有很多高级索引方式。
这里我想说的是类似“齐次坐标”的索引特性。
首先,单个元素可以看作是零维的向量,数学上零维也可以看作是任意维,因此可以这样玩:
julia> 2[1]
2
julia> 2[1, 1] # 被当成二维
2
julia> 2[1][1] # 2[1] 仍然是整数 2
2
julia> 2[1, 1, 1] # 三维
2
julia> 3.14[1]
3.14
julia> π[1, 1]
π = 3.1415926535897...
julia> '1'[1]
'1': ASCII/Unicode U+0031 (category Nd: Number, decimal digit)
julia> '1'[1, 1]
'1': ASCII/Unicode U+0031 (category Nd: Number, decimal digit)
多维数组也能使用类似“齐次坐标”的索引方式:
julia> m = [1 2; 3 4]
2×2 Array{Int64,2}:
1 2
3 4
julia> m[1][1] # m[1] 是整数 1,这相当于 1[1]
1
julia> m[1, 1, 1]
1
julia> m[1, 1, 1, 1]
1
多维矩阵,在更高的维度上,也能被当成“零维”来看待,前面说过了“零维”也相当于“无限维”,所以多维数组也能用这么索引。
但是拓展的维度索引只能是 1!既然被看作“零维”,就只相当于一个点,自然不可能有更高的索引:
julia> 1[1, 2]
ERROR: BoundsError
julia> m[1, 1, 2]
ERROR: BoundsError: attempt to access 2×2 Array{Int64,2} at index [1, 1, 2]
...
julia> m[1, 1, 1, 2]
ERROR: BoundsError: attempt to access 2×2 Array{Int64,2} at index [1, 1, 1, 2]
...
3. 推导式(comprehension)与生成器表达式(generator expression)
和 Python 的列表推导式与生成器表达式很像,但是更强大——Julia 是面向矩阵的。
julia> [i+j for i in 1:3 for j in 1:3] # 这个语法和 Python 一致
9-element Array{Int64,1}:
2
3
4
3
4
5
4
5
6
julia> [i+j for i in 1:3, j in 1:3] # 这个是多维的语法
3×3 Array{Int64,2}:
2 3 4
3 4 5
4 5 6
julia> [i+j for i in 1:3, j in 1:3 if iseven(i+j)] # 在后面加 guard 的情况下,结果坍缩成一维(这时两种语法结果没有差别)
5-element Array{Int64,1}:
2
4
4
4
6
julia> [(iseven(i+j) ? 1 : 2) for i in 1:3, j in 1:3] # 在前面做判断,因为没有过滤元素,所以仍然保持了原有结构。
3×3 Array{Int64,2}:
1 2 1
2 1 2
1 2 1
Julia 学习笔记(一):数组的更多相关文章
- PHP学习笔记之数组篇
摘要:其实PHP中的数组和JavaScript中的数组很相似,就是一系列键值对的集合.... 转载请注明来源:PHP学习笔记之数组篇 一.如何定义数组:在PHP中创建数组主要有两种方式,下面就让我 ...
- JavaScript学习笔记之数组(二)
JavaScript学习笔记之数组(二) 1.['1','2','3'].map(parseInt) 输出什么,为什么? ['1','2','3'].map(parseInt)//[1,NaN,NaN ...
- Scala入门学习笔记三--数组使用
前言 本篇主要讲Scala的Array.BufferArray.List,更多教程请参考:Scala教程 本篇知识点概括 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer 提 ...
- JavaScript学习笔记:数组reduce()和reduceRight()方法
很多时候需要累加数组项的得到一个值(比如说求和).如果你碰到一个类似的问题,你想到的方法是什么呢?会不会和我一样,想到的就是使用for或while循环,对数组进行迭代,依次将他们的值加起来.比如: v ...
- [Golang学习笔记] 07 数组和切片
01-06回顾: Go语言开发环境配置, 常用源码文件写法, 程序实体(尤其是变量)及其相关各种概念和编程技巧: 类型推断,变量重声明,可重名变量,类型推断,类型转换,别名类型和潜在类型 数组: 数组 ...
- go 学习笔记之数组还是切片都没什么不一样
上篇文章中详细介绍了 Go 的基础语言,指出了 Go 和其他主流的编程语言的差异性,比较侧重于语法细节,相信只要稍加记忆就能轻松从已有的编程语言切换到 Go 语言的编程习惯中,尽管这种切换可能并不是特 ...
- [学习笔记]JS 数组Array push相关问题
前言: 今天用写了一个二维数组,都赋值为零,然后更新其中一个值,结果和预期是不一样,会整列的相同位置都是同一个值. 1.用Chrome的控制台样例如下: arrs[2][2] =1的赋值,竟然是三个数 ...
- es6学习笔记一数组(中)
接着上一篇,给大家再分享一些数组的其他方法.大家也可以去点击这里学习数组更多的方法 concat方法: 概述: concat() 方法将传入的数组或非数组值与原数组合并,组成一个新的数组并返回. ...
- TSPL学习笔记(4):数组相关练习
最近研究函数式编程,都是haskell和scheme交互着看的,所以笔记中两种语言的内容都有,练习一般也都用两种语言分别实现. 本篇练习一些数组有关的问题,之所以与数组相关是因为在命令式编程中以下问题 ...
随机推荐
- Python 学习笔记(七)Python字符串(三)
常用字符串方法 split() 分割字符串,指定分隔符对字符串进行分割 join() 将序列中的元素以指定的字符连接生成一个新的字符串 str.strip() 用于移除字符串头尾指定的字符(默认 ...
- 简析--Java中常见的一些关键字的解析
在Java开发中我们经常会用到一些关键字,关键字的定义很有意思"Java事先定义好的,具有特殊含义的单词",那么我们怎么来用好关键字呢?下面我们对一些常见的关键字进行分析和比较; ...
- oracle聚簇表的理解 (转自:https://blog.csdn.net/gumengkai/article/details/51009345 )
Oracle支持两种类型的聚簇:索引聚簇和哈希聚簇 一.索引聚簇表的原理 聚簇:如果一些表有一些共同的列,则将这样一组表存储在相同的数据块中 聚簇还表示把相关的数据存储在同一个块上.利用聚簇,一个块可 ...
- oracle-03 表的管理
一.表名和列名的命名规则1).必须以字母开头2).长度不能超过30个字符3).不能使用oracle的保留字4).只能使用如下字符 a-z,a-z,0-9,$,#等 二.数据类型1).字符类char 长 ...
- CASE WHEN 小结
1.简单的一个case when 例子: CASE sex ' THEN '男' ' THEN '女' ELSE '其他' END 2. case when 在一整个表为空强行让其显示出一个值,在其后 ...
- 日常工作linux常用命令
1:cp 复制文件/文件夹 cp -r 源目录 目标目录 2:mv 文件重命名 mv 源文件/源目录 目标文件/目标目录 3:du -sh 查看当前目录大小 du -l 查看当前目录下文件大小 d ...
- InheritableThreadLocal线程复用
引自:http://www.cnblogs.com/sweetchildomine/p/6575666.html 虽然使用AOP可以获取方法签名,但是如果要获取方法中计算得出的数据,那么就得使用Thr ...
- 【linux运维递进】
================================云计算和虚拟化=================================== docker openstack svn git ...
- 配置Echarts大全
由于项目中需要用到Echarts,最近研究了一个星期.网上的教程也挺多的.磕磕碰碰的,难找到合适的例子.都说的马马虎虎.不废话了.开始. 这种上下排列的... 还有这种地图的.(如下) 还有就是配置的 ...
- git push之后回滚(撤销)代码
问题描述:首先,先说明一下,为什么会引发这次的话题,是这样的,我做完功能Agit push之后,2个月后需求部门要求不要功能A了,然后需要在没有功能A的基础上开发,怎么办?赶紧回滚代码呀. 然后我用g ...