关于 realine 读取 nested array 时的维度变化问题(BUG?)

没理解错的话,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

不过。。这种迷之混合特性真的好吗 :sweat_smile:。。。。

这不是迷之混合特性,[[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