没理解错的话,m = [[1,2],[3,4]] 是一个 2-element vector(each vector has two elements),直接去 ms = sympy.sympify(m) 会得到
2-element Vector{Sym}:
[1 2]
[3 4]
也即 size(ms)=(2,),as expected。
但是如果我把 [[1,2],[3,4]] 写在一个 test.txt,然后
using SymPy
open("test.txt") do io
while ! eof(io)
m = readline(io)
println(m)
ms = sympy.sympify(m)
println(ms)
end
end
会输出
[[1,2],[3,4]]
Sym[1 2; 3 4]
后者突然变成了一个 two-by-two matrix,也即 size(ms)=(2,2),为什么会这样??
啊我在 stackoverflow 问了有人回了。。
大概是这样的:面对 readline 读取的 string,sympy.sympify 的读取方案与 python 类似(将之视为了 python 数据结构的 two-by-two matrix);而直接作用于 Julia 的 Array 时,他还是以 Julia 的数据结构读取的。。。
一个对比:
sympy.sympify([[1,2],[3,4]])
sympy.sympify("[[1,2],[3,4]]")
分别给出
2-element Vector{Sym}:
[1 2]
[3 4]
和
2×2 Matrix{Sym}:
1 2
3 4
不过。。这种迷之混合特性真的好吗 。。。。
这不是迷之混合特性,[[1,2],[3,4]]
在 Julia 里是合法的表达,是 vector of vector. 而"[[1,2],[3,4]]"
是字符串,它的具体解释是不明确的,所以 sympy
根据 numpy 的表达方式进行理解也是正常的。
有一个类似的问题是字符串到数字的转换:
julia> Int(1.0)
1
julia> Int("1")
ERROR: MethodError: no method matching Int64(::String)
julia> parse(Int, 1.0)
ERROR: MethodError: no method matching parse(::Type{Int64}, ::Float64)
julia> parse(Int, "1")
1