为什么将大型字典从 python 传递给 julia flatten 包含多维列表?
Why does passing a large dictionary from python to julia flatten contained multidimensional lists?
好的...我正在为我玩的编码游戏创建一个 python 客户端。该游戏最初创建于 javascript,并使用了在 https://adventure.land/data.js 中找到的 json 游戏数据对象。在这个数据中,每个地图都有一个门列表,这个列表中的每个门都是一个属性列表。例如:
"doors":[[-965,-176,24,30,"woffice",0,1],[536,1665,64,32,"tunnel",0,2],[168,-149,32,40,"bank",0,3],[160,1370,24,32,"cave",0,4],[232,384,24,30,"arena",0,6],[-472,131,24,30,"tavern",0,8],[616,610,32,40,"mansion",0,10],[1936,-23,24,24,"level1",1,11],[169,-404,24,40,"hut",0,14],[1600,-547,60,40,"halloween",4,15],[312,-335,32,32,"mtunnel",0,16],[967,-584,32,32,"mtunnel",1,17],[1472,-434,32,32,"mtunnel",2,18]]
但是,从python发送给julia时,突然变成了:
"doors":[-965,-176,24,30,"woffice",0,1,536,1665,64,32,"tunnel",0,2,168,-149,32,40,"bank",0,3,160,1370,24,32,"cave",0,4,232,384,24,30,"arena",0,6,-472,131,24,30,"tavern",0,8,616,610,32,40,"mansion",0,10,1936,-23,24,24,"level1",1,11,169,-404,24,40,"hut",0,14,1600,-547,60,40,"halloween",4,15,312,-335,32,32,"mtunnel",0,16,967,-584,32,32,"mtunnel",1,17,1472,-434,32,32,"mtunnel",2,18]
有什么方法可以防止这种情况发生吗?如果没有,是否有可能的解决方法?因为考虑到随机列表扁平化,我在 python 中的 for door in doors
代码在直接转换为 julia 时不会完全具有相同的效果。
编辑:有人要求我提供“最小可重现代码”,但我不太确定最小值是多少,所以我只想说...
- 在 julia 中创建一个打印字典的函数
function printDict(d)
println(d)
end
- 在 python 中创建包含嵌套列表的字典
nestedlistdict = {"data": [[0,1,2,3],[4,5,6,7]]}
- 从 python 调用
printDict
函数,同时发送 nestedlistdict
变量作为参数
from julia import Main
Main.include("path/to/your/julia/file")
Main.file.printDict(nestedlistdict)
- 结果应该是:
Dict{Any, Any}("data" => [[0, 1, 2, 3], [4, 5, 6, 7]])
但我的结果是 Dict{Any, Any}("data" => [0 1 2 3; 4 5 6 7])
Edit2:经过进一步测试,它似乎有问题,因为它将嵌套列表转换为 Matrix
对象而不是嵌套 Vector
对象。
Julia 使用与 numpy 相同的列表列表解释:
>>> np.array([[1,2,3],[4,5,6]])
array([[1, 2, 3],
[4, 5, 6]])
或朱莉娅:
julia> using PyCall
julia> py"[[1,2,3],[4,5,6]]"
2×3 Matrix{Int64}:
1 2 3
4 5 6
如果你想要一个实际的向量向量,你需要像你需要做一个 numpy 数组的向量一样的方法。
Python 版本:
>>> [np.array([1,2,3]),np.array([1,2,3])]
[np.array([1, 2, 3]), np.array([1, 2, 3])]
Julia 版本(这是您实际要求的):
julia> np = pyimport("numpy");
julia> py"[$np.array([1, 2, 3]), $np.array([1, 2, 3])]"
2-element Vector{Vector{Int32}}:
[1, 2, 3]
[1, 2, 3]
另一个可能更简单的选择是将所有内容打包到一个元组中:
julia> py"tuple([[1,2,3],[4,5,6]])"
([1, 2, 3], [4, 5, 6])
好的...我正在为我玩的编码游戏创建一个 python 客户端。该游戏最初创建于 javascript,并使用了在 https://adventure.land/data.js 中找到的 json 游戏数据对象。在这个数据中,每个地图都有一个门列表,这个列表中的每个门都是一个属性列表。例如:
"doors":[[-965,-176,24,30,"woffice",0,1],[536,1665,64,32,"tunnel",0,2],[168,-149,32,40,"bank",0,3],[160,1370,24,32,"cave",0,4],[232,384,24,30,"arena",0,6],[-472,131,24,30,"tavern",0,8],[616,610,32,40,"mansion",0,10],[1936,-23,24,24,"level1",1,11],[169,-404,24,40,"hut",0,14],[1600,-547,60,40,"halloween",4,15],[312,-335,32,32,"mtunnel",0,16],[967,-584,32,32,"mtunnel",1,17],[1472,-434,32,32,"mtunnel",2,18]]
但是,从python发送给julia时,突然变成了:
"doors":[-965,-176,24,30,"woffice",0,1,536,1665,64,32,"tunnel",0,2,168,-149,32,40,"bank",0,3,160,1370,24,32,"cave",0,4,232,384,24,30,"arena",0,6,-472,131,24,30,"tavern",0,8,616,610,32,40,"mansion",0,10,1936,-23,24,24,"level1",1,11,169,-404,24,40,"hut",0,14,1600,-547,60,40,"halloween",4,15,312,-335,32,32,"mtunnel",0,16,967,-584,32,32,"mtunnel",1,17,1472,-434,32,32,"mtunnel",2,18]
有什么方法可以防止这种情况发生吗?如果没有,是否有可能的解决方法?因为考虑到随机列表扁平化,我在 python 中的 for door in doors
代码在直接转换为 julia 时不会完全具有相同的效果。
编辑:有人要求我提供“最小可重现代码”,但我不太确定最小值是多少,所以我只想说...
- 在 julia 中创建一个打印字典的函数
function printDict(d)
println(d)
end
- 在 python 中创建包含嵌套列表的字典
nestedlistdict = {"data": [[0,1,2,3],[4,5,6,7]]}
- 从 python 调用
printDict
函数,同时发送nestedlistdict
变量作为参数
from julia import Main
Main.include("path/to/your/julia/file")
Main.file.printDict(nestedlistdict)
- 结果应该是:
Dict{Any, Any}("data" => [[0, 1, 2, 3], [4, 5, 6, 7]])
但我的结果是Dict{Any, Any}("data" => [0 1 2 3; 4 5 6 7])
Edit2:经过进一步测试,它似乎有问题,因为它将嵌套列表转换为 Matrix
对象而不是嵌套 Vector
对象。
Julia 使用与 numpy 相同的列表列表解释:
>>> np.array([[1,2,3],[4,5,6]])
array([[1, 2, 3],
[4, 5, 6]])
或朱莉娅:
julia> using PyCall
julia> py"[[1,2,3],[4,5,6]]"
2×3 Matrix{Int64}:
1 2 3
4 5 6
如果你想要一个实际的向量向量,你需要像你需要做一个 numpy 数组的向量一样的方法。 Python 版本:
>>> [np.array([1,2,3]),np.array([1,2,3])]
[np.array([1, 2, 3]), np.array([1, 2, 3])]
Julia 版本(这是您实际要求的):
julia> np = pyimport("numpy");
julia> py"[$np.array([1, 2, 3]), $np.array([1, 2, 3])]"
2-element Vector{Vector{Int32}}:
[1, 2, 3]
[1, 2, 3]
另一个可能更简单的选择是将所有内容打包到一个元组中:
julia> py"tuple([[1,2,3],[4,5,6]])"
([1, 2, 3], [4, 5, 6])