当前位置:K88软件开发文章中心编程语言非主流编程语言Julia → 文章内容

Julia 多维数组

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-15 16:28:18

由 陈 创建, 最后一次修改 2016-08-12 多维数组数组是一个存在多维网格中的对象集合。通常,数组包含的对象的类型为 Any 。对大多数计算而言,数组对象一般更具体为 Float64 或 Int32 。因为性能的原因,Julia 不希望把程序写成向量化的形式。在 Julia 中,通过引用将参数传递给函数。Julia 的库函数不会修改传递给它的输入。用户写代码时,如果要想做类似的功能,要注意先把输入复制一份儿。数组基础函数函数说明eltype(A)A 中元素的类型length(A)A 中元素的个数ndims(A)A 有几个维度nnz(A)A 中非零元素的个数size(A)返回一个元素为 A 的维度的多元组size(A,n)A 在某个维度上的长度stride(A,k)在维度 k 上,邻接元素(在内存中)的线性索引距离strides(A)返回多元组,其元素为在每个维度上,邻接元素(在内存中)的线性索引距离构造和初始化下列函数中调用的 dims... 参数,既可以是维度的单多元组,也可以是维度作为可变参数时的一组值。函数说明Array(type, dims...)未初始化的稠密数组cell(dims...)未初始化的元胞数组(异构数组)zeros(type, dims...) |指定类型的全 0 数组. 如果未指明 type, 默认为 Float64zeros(A) |全 0 数组, 元素类型和大小同 A.ones(type, dims...) |指定类型的全 1 数组. 如果未指明 type, 默认为 Float64ones(A) |全 1 数组, 元素类型和大小同 A.trues(dims...) | 全 true 的 Bool 数组falses(dims...) | 全 false 的 Bool 数组reshape(A, dims...)将数组中的数据按照指定维度排列copy(A) | 复制 Adeepcopy(A) | 复制 A ,并递归复制其元素similar(A, element_type, dims...)属性与输入数组(稠密、稀疏等)相同的未初始化数组,但指明了元素类型和维度。第二、三参数可省略,省略时默认为 A 的元素类型和维度reinterpret(type, A)二进制数据与输入数组相同的数组,但指明了元素类型rand(dims) | 在 [0,1) 上独立均匀同分布的 Float64 类型的随机数组randn(dims) | Float64 类型的独立正态同分布的随机数组,均值为 0 ,标准差为 1eye(n) | n x n 单位矩阵eye(m, n) | m x n 单位矩阵linspace(start, stop, n)| 从 start 至 stop 的由 n 个元素构成的线性向量fill!(A, x) | 用值 x 填充数组 Afill(x, dims) | 创建指定规模的数组, 并使用 x 填充连接使用下列函数,可在任意维度连接数组:函数描述cat(k, A...) | 在 k 维度上连接输入 n-d 数组vcat(A...) | cat(1, A...) 的简写hcat(A...) |cat(2, A...) 的简写传递给这些函数的标量值被视为一元阵列。级联功能非常常用,所以为它们设计了特殊的语法:表示调用[A B C ...] |hcat[A, B, C, ...] |vcat[A B; C D; ...] |hvcathvcat 可以实现一维上的(使用分号间隔)或二维上的(使用空格间隔)的级联。ComprehensionsComprehensions 用于构造数组。它的语法类似于数学中的集合标记法: A = [ F(x,y,...) for x=rx, y=ry, ... ]F(x,y,...) 根据变量 x, y 等来求值。这些变量的值可以是任何迭代对象,但大多数情况下,都使用类似于 1:n 或 2:(n-1) 的范围对象,或显式指明为类似 [1.2, 3.4, 5.7] 的数组。它的结果是 N 维稠密数组。下例计算在维度 1 上,当前元素及左右邻居元素的加权平均数: julia> const x = rand(8) 8-element Array{Float64,1}: 0.843025 0.869052 0.365105 0.699456 0.977653 0.994953 0.41084 0.809411 julia> [ 0.25*x[i-1] + 0.5*x[i] + 0.25*x[i+1] for i=2:length(x)-1 ] 6-element Array{Float64,1}: 0.736559 0.57468 0.685417 0.912429 0.8446 0.656511注解:上例中,x 被声明为常量,因为对于非常量的全局变量,Julia 的类型推断不怎么样。可在 comprehension 之前显式指明它的类型。如要避免在前例中声明 x 为常量,但仍要确保结果类型为 Float64,应这样写: Float64[ 0.25*x[i-1] + 0.5*x[i] + 0.25*x[i+1] for i=2:length(x)-1 ]使用花括号来替代方括号,可以将它简写为 Any 类型的数组: julia> { i/2 for i = 1:3 } 3-element Array{Any,1}: 0.5 1.0 1.5索引索引 n 维数组 A 的通用语法为: X = A[I_1, I_2, ..., I_n]其中 I_k 可以是:标量满足 :, a:b, 或 a:b:c 格式的 Range 对象任意整数向量,包括空向量 []布尔值向量结果 X 的维度通常为 (length(I_1), length(I_2), ..., length(I_n)) ,且 X 的索引 (i_1, i_2, ..., i_n) 处的值为 A[I_1[i_1], I_2[i_2], ..., I_n[i_n]] 。缀在后面的标量索引的维度信息被舍弃。如,A[I, 1] 的维度为 (length(I),)。布尔值向量先由 find 函数进行转换。由布尔值向量索引的维度长度,是向量中 true 值的个数。索引语法与调用 getindex 等价: X = getindex(A, I_1, I_2, ..., I_n)例如: julia> x = reshape(1:16, 4, 4) 4x4 Array{Int64,2}: 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 julia> x[2:3, 2:end-1] 2x2 Array{Int64,2}: 6 10 7 11n:n-1 形式的空范围有时用来表示相互索引位置在 n-1 和 n之间。例如,在 searchsorted 函数使用本习惯指出插入点的值不在排序后的数组中: julia> a = [1,2,5,6,7]; julia> searchsorted(a, 3) 3:2赋值给 n 维数组 A 赋值的通用语法为: A[I_1, I_2, ..., I_n] = X其中 I_k 可能是:标量满足 :, a:b, 或 a:b:c 格式的 Range 对象任意整数向量,包括空向量 []布尔值向量如果 X 是一个数组,它的维度应为 (length(I_1), length(I_2), ..., length(I_n)) ,且 A 在 i_1, i_2, ..., i_n 处的值被覆写为 X[I_1[i_1], I_2[i_2], ..., I_n[i_n]] 。如果 X 不是数组,它的值被写进所有 A 被引用的地方。用于索引的布尔值向量与 getindex 中一样(先由 find 函数进

[1] [2] [3]  下一页


Julia 多维数组