Julia语言介绍(二)多维数组

多维数组是科学计算中最核心的部分,与其它语言多依赖于第三方实现不同,Julia的多维数组是完全独立编写,并且提供了非常优秀的性能。

对Julia语言本身来说,它只提供了数组,更高抽象度的实现如TimeSeriesDataFrames,在另一个专门面向统计和机器学习的项目Julia Statistics中,需要通过添加Package的方式进行引用。

数组

首先来看看一个基本的数组,和Python的语法类似:

julia> l = [3, 4, 5]
3-element Array{Int64,1}:
3
4
5

Julia根据输入的数据绑定数组的类型,[3., 4, 5] 将产生一个 Array{Float64,1} 的类型,如果数值与字符串都存在于数组中,则会绑定 any 类型。

julia> l = [3., "a"]
2-element Array{Any,1}:
3.0
"a"

对单个字符而言,它会被转为另一个成员的类型:数值或浮点型:

julia> l = [3., 'a']
2-element Array{Float64,1}:
3.0
97.0

可以使用大括号创建一个 any 类型的数组,在 any 类型数组内部即使包含数组也会被当作一个成员,而非多维数组:

julia> l = { 3., "a", [3, 4] }
3-element Array{Any,1}:
3.0
"a"
[3,4]

索引

如果你以前使用过NumPy的数组索引,那么会对Julia的语法不会陌生,这里的区别是,Julia使用 end 来标识索引的尾部,在NumPy中我们只需要在冒号后留空。end 关键字在Julia中很常用,函数定义、控制语句甚至索引中都出现了。还要特别注意的是,Julia的索引是从 1 开始的。

julia> l[1]
3.0
julia> l[1:2]
2-element Array{Any,1}:
3.0
"a"
julia> l[2:end]
2-element Array{Any,1}:
"a"
[3,4]

数组操作

Julia使用 push! 函数将成员追加到数组末尾,不支持追加不同类型的成员,但小数点为0的浮点类型可以自动转换。

julia> l = [3, 4, 5]
julia> push!(l, 12.0)
4-element Array{Int64,1}:
3
4
5
12
julia> push!(l, 12.1)
ERROR: InexactError() in push!
julia> push!(l, "hello")
ERROR: 'convert' has no method matching conver(::Type{Int64}, ::ASCIIString) in push!

append! 函数则将一个数组的所有成员追加到原始数组中:

julia> append!(l, [10, 11, 12])
7-element Array{Int64,1}:
3
4
5
12
10
11
12

对于数组,可直接使用加减乘除运算符进行操作。

julia> a = [1.1, 2.2, 3.3]
julia> b = [4.4, 5.5, 6.6]
julia> a + b
5.5
7.7
9.9

对于数组和矩阵的乘法,Julia采用了Matlab的语法,使用 .* 而不是NumPy式的 *

julia> a .* b
4.84
12.1
21.78

向量和矩阵

向量可以视为 m x n 矩阵 m = 1 的情况,Jilia中的数组的表现特点可与向量等同。定义一个向量是使用不带逗号的“数组”:

julia> vec = [3 4 5]
1x3 Array{Int64,2}:
3 4 5

矩阵的转置是使用 来完成,对于复数矩阵,可以使用 .’ 直接完成共轭复数转置。

julia> [lim, 2]'
1x2 Array{Complex{Int64},2}:
0-lim 2+0im
julia> [lim, 2].'
1x2 Array{Complex{Int64},2}:
0+im 2+0im

下面是一个 2 x 2 的矩阵创建和转置操作:

julia> M = [1 2; 3 4; 56]
3x2 Array{Int64,2}:
1 2
3 4
5 6
julia> M'
2x3 Array{Int64,2}:
1 3 5
2 4 6

最后重新提一下科学计算中的数组。上面说到数组等同于向量是什么意思呢?我们来看看它与NumPy数组运算和编程语言中数组(Array)的区别。

# Julia
julia> l = [3, 4, 5]
3-element Array{Int64,1}:
3
4
5
julia> l' # 数组通过转置变成了向量
1x3 Array{Int64,2}:
3 4 5
julia> l'' # 再次转置变成了一个矩阵
3x1 Array{Int64,2}
3
4
5
# NumPy array
In [1]: import numpy as np
In [2]: a = np.array([1, 2, 3])
In [3]: b = np.array([4, 5, 6])
In [4]: a.shape
Out[4]: (3,)
In [5]: a + b
Out[5]: array([5, 7, 9])
In [6]: a * b
Out[6]: array([4, 10, 18])
# Python basic array
In [1]: a = [1, 2, 3]
In [2]: b = [4, 5, 6]
In [3]: a + b
Out[3]: [1, 2, 3, 4, 5, 6]
In [4]: a * b
---------------------------------------------------------------------------
TypeError in () ----> 1 a * b
TypeError: can't multiply sequence by non-int of type 'list'

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>