天道酬勤,学无止境

julia

在 Julia 中保存和检索字典的正确方法是什么?(What is the correct way to save and retrieve dictionaries in Julia?)

问题 我已经看到 Julia 能够很好地解释“MAT”文件,这些文件中有结构,可以毫无问题地作为字典读取。 现在我已经创建了自己的字典,它具有以下结构 (String, String)=> [ Int, Int, Int] 在每个条目上。 我可以用writeddlm保存它,它会生成一个非常有序的表格文本文件,由制表符( \t )分隔,但是如果不进行大量解析,我就无法检索它。 如果我使用readdlm我会得到一个 Any 类型的数组,每行都有非常不readdlm结构 "(\"Bla bla\", \"tururu\")" "[a, b, c]" 也就是说,两列字符串包含诸如'"'和'['符号。 回答1 您可以使用 HDF5 包中包含的JLD (Julia Data) 子模块: Pkg.add("HDF5") using HDF5, JLD d = Dict( ("a", "b") => [1, 2, 3], ("c", "d") => [4, 5, 6], ("e", "f") => [7, 8, 9] ) save("data.jld", "data", d) load("data.jld")["data"] JLD 模块的优点是它保留了每个变量的确切类型信息。 回答2 由于某种原因,SalchiPapa 建议的使用 JLD 的解决方案不再有效。 这是他们使用 JLD2

2021-09-21 18:11:52    分类:技术分享    file   parsing   julia

Julia 在循环中更改名称,使用符号变量(Julia changing name in loop, using symbolic variables)

问题 我想在循环的每次迭代中更改符号变量的名称,然后使用这些符号变量求解方程,例如: using SymPy for i in 1:5 p{i} = symbols("p"{i}, real=true,positive=true) solve(p{i}^2-i^2) end 因此,我希望创建一系列标量符号变量(因为我认为不可能创建向量值符号变量),每个变量都具有不同的名称 - p1、p2、p3、p4 和 p5 - 然后使用这些在方程求解器中。 然而,花括号符号似乎不适用于按照 matlab 在 julia 中命名。 快速谷歌没有建议任何明显的答案。 有任何想法吗? 回答1 在 julia 和大多数计算机语言中,如果您发现自己需要一堆数字变量 x1, x2, x3, ... ,您可能需要一个数组。 在 julia 中,这可能看起来像这样,(但请注意,我不知道我在用 SymPy 做什么) using SymPy pp=Sym[] for i in 1:5 p = symbols("x$i", real=true,positive=true) push!(pp,p) solve(pp[i]^2-i^2) end 在这里,我们从 pp 空开始,但类型正确; 我们将每个符号推到 pp 的末尾; 最后,我们可以用pp[i]找出 pp 的第 i 个项目,这几乎是您的代码,但没有 shift 键。

2021-09-21 17:53:14    分类:技术分享    julia   sympy   symbolic-math

检查是否可以安全地评估符号(Check whether a symbol can be safely evaluated)

问题 我有一个字符串x 。 我认为x是一种类型的字符串表示,它是Number的子类型。 例如, x可能采用值"Float64" 。 我可以使用以下方法检查: eval(parse(x)) <: Number 但是, x可能包含一些危险的东西,比如"rm(something_important)"上的一些变体,所以使用eval是一个坏主意,直到我确定x是安全的。 有什么方法可以安全地检查x是否是Number子类型的字符串表示? (除了构建Number的所有可能子类型的字符串数组并进行比较...) 回答1 HDF5.jl 包必须处理这个问题。 它通过解析字符串然后在eval之前检查结果来解决它。 如果解析的字符串是它认为是 valid_type_expression 的内容,那么它就知道在Main命名空间中求值应该是安全的。 这允许它从 Main 命名空间中baremodule在baremodule不可用的自定义类型。 更多详细信息:解析任意字符串后,您可以检查返回的对象以查看它是否“安全”进行评估: julia> dump(parse("Int")) Symbol Int julia> dump(parse("Vector{Int}")) Expr head: Symbol curly args: Array(Any,(2,)) 1: Symbol Vector 2: Symbol

2021-09-21 17:00:46    分类:技术分享    julia

如何获得 Julia 复合类型的深拷贝?(How to obtain deep copies of Julia composite types?)

问题 所以这里是设置。 我有多个复合类型定义了它们自己的字段和构造函数。 让我们在这里展示两个简化的组件: type component1 x y end type component2 x y z end 现在我想定义一个新类型,以便它可以在其中保存先前定义的复合类型的大小为 K 的数组。 所以它是一个有两个字段的参数复合类型:一个是整数K,另一个是传递的类型的大小为K的数组。 type mixture{T} components::Array{T, 1} K::Int64 function mixture(qq::T, K::Int64) components = Array{typeof(qq), K} for k in 1:K components[k] = qq end new(components, K) end end 但这不是正确的方法。 因为所有 K 个组件都指向一个对象并且操作 mix.components[k] 将影响所有 K 个组件。 在 python 中,我可以用 deepcopy 解决这个问题。 但是 Julia 中的 deepcopy 不是为复合类型定义的。 我该如何解决这个问题? 回答1 对您的具体问题的回答: 当您在 Julia 中定义新类型时,通常会将Base一些标准方法扩展到您的新类型,包括deepcopy 。 例如: type MyType

2021-09-21 14:58:04    分类:技术分享    julia

如何在不同版本的 Julia 之间切换(特别是在 Ubuntu 上的 v0.3 和 v0.4 之间)?(How do I switch between different versions of Julia (specifically between v0.3 and v0.4 on Ubuntu)?)

问题 我正在使用 Julia v0.3 进行一些项目。 但是,我想在 v0.3 和 v0.4 中测试我的代码(因为一些将要使用它的人已经在使用 v0.4)。 我正在运行 Ubuntu 14.04 并使用 apt-get 安装了 Julia。 我知道 v0.4 可通过 PPA julianightlies 获得,但如果我添加它,v0.3 将被替换。 有没有一种方法可以安装并在两个版本之间快速切换以进行测试? 回答1 您可以在不同位置安装不同版本的 Julia 并设置单独的符号链接。 例如,您可以下载 v0.3 Linux 二进制文件并将它们安装到一个位置,然后克隆 v0.4 的 GitHub 源代码并将其安装在另一个位置。 然后设置符号链接,如julia3为V0.3和julia4为V0.4。 运行您的代码,如: $ julia3 somefile.jl $ julia4 somefile.jl 回答2 通过编译安装,然后将文件开头的 she-bang 更改为 #!/path_to/julia3 要么 #!/path_to/julia4 这样就行了

2021-09-21 12:39:47    分类:技术分享    linux   ubuntu   ubuntu-14.04   julia

Julia 并行编程 - 使所有工作人员都可以使用现有功能(Julia parallel programming - Making existing function available to all workers)

问题 我面临以下问题: 我有一个名为TrainModel的函数,它在单个线程上运行了很长时间。 当它完成计算时,它返回一个函数作为输出参数,我们称之为f 。 当我查询这个f的类型时,Julia 返回: (具有 1 个方法的通用函数) (我不确定这最后一条信息是否对任何阅读本文的人有用) 现在在第二步中,我需要对非常大的值数组应用函数f 。 这是我想要并行化的步骤。 已经用多个进程启动了 Julia,例如 julia -p 4 理想情况下,我会使用: pmap(f, my_values) 也许: aux = @parallel (hcat) for ii=1:100000000 f(my_values[ii]) end 不幸的是,这行不通。 Julia 抱怨工人不知道函数f ,即我收到一条消息: 错误:未在进程 2 上定义函数 f 我怎样才能让函数f对所有工人可用? 显然,一个“肮脏”的解决方案是在所有工人上运行耗时的函数TrainModel ,可能像这样: @everywhere f = TrainModel( ... ) 但是当我想要的只是结果f可供所有工人使用时,这将是对 CPU 的浪费。 虽然我搜索了有类似问题的帖子,但到目前为止我找不到答案...... 提前致谢! 最好的, N。 回答1 返回函数的方法看起来很优雅,但不幸的是,与 JavaScript 不同,Julia

2021-09-21 11:04:48    分类:技术分享    for-loop   parallel-processing   julia

Julia lang - 如何从 HTTP URL 读取 JSON(Julia lang - How to read JSON from HTTP URL)

问题 目标 如何使用 Julia-lang 从 HTTP URL 读取 JSON? 回答1 代码 #Importing Requests package Pkg.add("Requests") using Requests.get; import JSON; url = "http://query.yahooapis.com/v1/public/yql?q=select%20DaysRange%20from%20yahoo.finance.quotes%20where%20symbol%20in%20%28%22EBAY%22%29%20&env=http://datatables.org/alltables.env&format=json"; #Reads the data from HTTP URL es = get(url); j = JSON.parse(es.data) #Prints the data from JSON print(j["query"]["results"]["quote"]) 吉特要点 回答2 替代方法,使用 HTTP(在此处找到): using HTTP, JSON resp = HTTP.get("https://api.github.com/users/juliohm") str = String(resp.body) jobj = JSON

2021-09-21 09:53:09    分类:技术分享    json   julia   http-get

Julia:实例化类型参数(Julia: Instantiated type parameters)

问题 如何定义像 Array 一样具有具体/实例化类型参数的类型? 我最初的直觉是它会是这样的: immutable Foo{N::Integer} data::Array{Float64, N} end 但是,这会产生以下错误: 错误:语法:格式错误的类型参数列表 以下代码是可以接受的: immutable Foo{N} data::Array{Float64, N} end Foo{1}([1,2,3]) Foo{1}([1.0,2.0,3.0]) 但我一直找不到关于限制参数 N 类型的任何说明。我意识到在这种情况下它可能不是绝对必要的,但它肯定会提供更直观的错误消息并且应该是可能的? 编辑: 我找到了一个像这样的部分解决方案: immutable Bar{N} data::Array{Int64, N} Bar(dat) = ( typeof(N) <: Integer && N > 0 ? new(dat) : error("Bar parameter N must be a positive integer")) end Bar{1}([1,2,3]) 条形{1}([1,2,3]) Bar{0}([]) 错误:条形参数 N 必须是正整数 虽然这解决了手头的问题,但我仍然想知道是否有一种方法可以像我在本文的初始代码片段中尝试做的那样预先指定类型参数的实例化类型? 回答1

2021-09-21 06:27:00    分类:技术分享    types   julia   type-parameter

将许多标准方法扩展到新的自定义向量类型(Extend many standard methods to a new custom vector type)

问题 我构建了一个新的向量类型: type MyType x::Vector{Float64} end 我想将许多标准方法(例如加法、减法、元素比较等)扩展到我的新类型。 我是否需要为每个方法定义一个方法定义,例如: +(a::MyType, b::MyType) = a.x + b.x -(a::MyType, b::MyType) = a.x - b.x .<(a::MyType, b::MyType) = a.x .< b.x 或者我可以在这里使用一些语法捷径吗? 回答1 这是使用 Julia 元编程的示例: for op in (:+, :-, :.<) @eval ($op)(a::MyType, b::MyType) = ($op)(a.x, b.x) end 回答2 您可以从AbstractArray继承并定义一个非常小的接口来免费获取所有基本数组操作: type MyType <: AbstractVector{Float64} x::Vector{Float64} end Base.linearindexing(::Type{MyType}) = Base.LinearFast() Base.size(m::MyType) = size(m.x) Base.getindex(m::MyType,i::Int) = m.x[i] Base.setindex!(m

2021-09-21 02:23:19    分类:技术分享    julia

是否有与 NumPy 的省略号切片语法 (...) 等效的 Julia?(Is there a Julia equivalent to NumPy's ellipsis slicing syntax (…)?)

问题 在 NumPy 中,省略号语法用于 填充多个:直到切片说明符的数量与数组的维度匹配。 (解释这个答案)。 我怎么能在朱莉娅做到这一点? 回答1 还没有,但如果你愿意,你可以帮助自己。 import Base.getindex, Base.setindex! const .. = Val{:...} setindex!{T}(A::AbstractArray{T,1}, x, ::Type{Val{:...}}, n) = A[n] = x setindex!{T}(A::AbstractArray{T,2}, x, ::Type{Val{:...}}, n) = A[ :, n] = x setindex!{T}(A::AbstractArray{T,3}, x, ::Type{Val{:...}}, n) = A[ :, :, n] =x getindex{T}(A::AbstractArray{T,1}, ::Type{Val{:...}}, n) = A[n] getindex{T}(A::AbstractArray{T,2}, ::Type{Val{:...}}, n) = A[ :, n] getindex{T}(A::AbstractArray{T,3}, ::Type{Val{:...}}, n) = A[ :, :, n] 然后你可以写 > rand(3,3

2021-09-20 21:49:26    分类:技术分享    numpy   multidimensional-array   slice   julia