个人向,只会记录一些需要注意的点。

前言

学习 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 学习笔记(一):数组的更多相关文章

  1. PHP学习笔记之数组篇

    摘要:其实PHP中的数组和JavaScript中的数组很相似,就是一系列键值对的集合.... 转载请注明来源:PHP学习笔记之数组篇   一.如何定义数组:在PHP中创建数组主要有两种方式,下面就让我 ...

  2. JavaScript学习笔记之数组(二)

    JavaScript学习笔记之数组(二) 1.['1','2','3'].map(parseInt) 输出什么,为什么? ['1','2','3'].map(parseInt)//[1,NaN,NaN ...

  3. Scala入门学习笔记三--数组使用

    前言 本篇主要讲Scala的Array.BufferArray.List,更多教程请参考:Scala教程 本篇知识点概括 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer 提 ...

  4. JavaScript学习笔记:数组reduce()和reduceRight()方法

    很多时候需要累加数组项的得到一个值(比如说求和).如果你碰到一个类似的问题,你想到的方法是什么呢?会不会和我一样,想到的就是使用for或while循环,对数组进行迭代,依次将他们的值加起来.比如: v ...

  5. [Golang学习笔记] 07 数组和切片

    01-06回顾: Go语言开发环境配置, 常用源码文件写法, 程序实体(尤其是变量)及其相关各种概念和编程技巧: 类型推断,变量重声明,可重名变量,类型推断,类型转换,别名类型和潜在类型 数组: 数组 ...

  6. go 学习笔记之数组还是切片都没什么不一样

    上篇文章中详细介绍了 Go 的基础语言,指出了 Go 和其他主流的编程语言的差异性,比较侧重于语法细节,相信只要稍加记忆就能轻松从已有的编程语言切换到 Go 语言的编程习惯中,尽管这种切换可能并不是特 ...

  7. [学习笔记]JS 数组Array push相关问题

    前言: 今天用写了一个二维数组,都赋值为零,然后更新其中一个值,结果和预期是不一样,会整列的相同位置都是同一个值. 1.用Chrome的控制台样例如下: arrs[2][2] =1的赋值,竟然是三个数 ...

  8. es6学习笔记一数组(中)

    接着上一篇,给大家再分享一些数组的其他方法.大家也可以去点击这里学习数组更多的方法 concat方法: 概述:    concat() 方法将传入的数组或非数组值与原数组合并,组成一个新的数组并返回. ...

  9. TSPL学习笔记(4):数组相关练习

    最近研究函数式编程,都是haskell和scheme交互着看的,所以笔记中两种语言的内容都有,练习一般也都用两种语言分别实现. 本篇练习一些数组有关的问题,之所以与数组相关是因为在命令式编程中以下问题 ...

随机推荐

  1. js中的AJAX

    AJAX:Asynchronous JavaScript and XML.意思就是用JavaScript执行异步网络请求. 如果仔细观察一个Form的提交,你就会发现,一旦用户点击Submit按钮,表 ...

  2. Question20171231 聊聊为什么32bit只能支持4GB内存

    1. 32位系统最大只能支持4GB内存之由来 也许大家对这个问题都不陌生,实际装过系统用过电脑的朋友可能都有这样的经历:自己电脑配的是4G的内存条,可是装完系统之后发现电脑上显示的只有3.2G左右可用 ...

  3. 没有上司的舞会(树形DP)

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  4. string类中字符的大小写转换

    今天做一道题,要用string类,涉及大小写转换,查看了C++文档,string类没有提供这样的方法,只好自己写. 之后是想到一个比较笨的方法,我把string当成一个容器,然后用迭代器一个一个来替换 ...

  5. leetcode笔记(六)740. Delete and Earn

    题目描述 Given an array nums of integers, you can perform operations on the array. In each operation, yo ...

  6. poj 2553 The Bottom of a Graph : tarjan O(n) 存环中的点

    /** problem: http://poj.org/problem?id=2553 将所有出度为0环中的点排序输出即可. **/ #include<stdio.h> #include& ...

  7. python的字典数据类型及常用操作

    字典的定义与特性 字典是Python语言中唯一的映射类型. 定义:{key1: value1, key2: value2} 1.键与值用冒号“:”分开: 2.项与项用逗号“,”分开: 特性: 1.ke ...

  8. 【ntp时间校准配置】

    Ntp(网络时间协议)是一种可以通过TCP/IP网络传播,其架构模式可分为C/S(客户端/服务器),PTP(对等),broatcast(广播), mutilbrocast(组播),无论在任何系统或设备 ...

  9. webpack 4.14配置详解

    1.安装nodejs 官网下载nodejs,安装时可能会爆 2503错误,解决办法是:使用管理员命令执行安装文件.cmd ->命令提示符(管理员)-> 输入: msiexec /packa ...

  10. mysql数据库的基本使用命令总结

    mysql数据库是一个常用的关系型数据库 关系型数据库核心元素有哪些? 主键:特殊字段,用来唯一标识记录的唯一性 字段:数据列 记录:数据行 数据表:数据行的集合 数据库:数据表的集合 安装.启动.停 ...