在 Julia 中(解)压缩数组的正确方法
Correct way to (un)zip arrays in Julia
我在 Julia 中使用 PyPlot 库进行绘图,散点函数似乎有一个 "little" 不便之处,即它只接受坐标作为两个参数:一个数组用于所有 x 值,并且另一个用于所有 y 值,即
scatter(xxs,yys)
和 x=[x1,x2,...]
,以及 y=[y1,y2,...]
。
如果我有一个带有坐标点的集合或元组,例如
A=([x1,y1],[x2,y2],...)
直接在Python中使用pyplot/matplotlib解决了一个班轮的不便,经证实here in Whosebug:
plt.scatter(*zip(*li))
但 Julia 上的 zip 似乎完全不同。到目前为止,我已经提出了以下解决方案,但它似乎很不优雅:
x=[]
y=[]
for j in selectos
append!(x,j[2])
append!(y,j[1])
end
scatter(x,y, marker="o",c="black")
是否有更多"functional"或单行(或两行)方法?
我可以想到三种方法:
using PyPlot
A = ([1,2],[3,4],[5,6],[7,8])
# approach 1
scatter(zip(A...)...)
# approach 2
B = hcat(A...)
@views scatter(B[1,:], B[2,:])
# approach 3
scatter([x[1] for x in A], [x[2] for x in A])
第一个可能是最实用的风格。
在第二个中你得到 B
如果你需要分析数据,它更容易使用; n.b。 @views
需要 Julia 0.6,但可以省略。
第三个可能是最容易理解的。
正如另一个答案中提到的,可以在 Julia 中使用相同的方法,即 scatter(zip(A...)...)
,但这对于较大的向量来说非常慢,应该是避免了。
另一种可能性是使用 getindex.(A, i)
来获取 A
.
中向量的所有第 i
个元素的向量
julia> A = [[i, 10i] for i=1:5]
5-element Array{Array{Int64,1},1}:
[1, 10]
[2, 20]
[3, 30]
[4, 40]
[5, 50]
julia> getindex.(A,1)
5-element Array{Int64,1}:
1
2
3
4
5
julia> getindex.(A,2)
5-element Array{Int64,1}:
10
20
30
40
50
我在 Julia 中使用 PyPlot 库进行绘图,散点函数似乎有一个 "little" 不便之处,即它只接受坐标作为两个参数:一个数组用于所有 x 值,并且另一个用于所有 y 值,即
scatter(xxs,yys)
和 x=[x1,x2,...]
,以及 y=[y1,y2,...]
。
如果我有一个带有坐标点的集合或元组,例如
A=([x1,y1],[x2,y2],...)
直接在Python中使用pyplot/matplotlib解决了一个班轮的不便,经证实here in Whosebug:
plt.scatter(*zip(*li))
但 Julia 上的 zip 似乎完全不同。到目前为止,我已经提出了以下解决方案,但它似乎很不优雅:
x=[]
y=[]
for j in selectos
append!(x,j[2])
append!(y,j[1])
end
scatter(x,y, marker="o",c="black")
是否有更多"functional"或单行(或两行)方法?
我可以想到三种方法:
using PyPlot
A = ([1,2],[3,4],[5,6],[7,8])
# approach 1
scatter(zip(A...)...)
# approach 2
B = hcat(A...)
@views scatter(B[1,:], B[2,:])
# approach 3
scatter([x[1] for x in A], [x[2] for x in A])
第一个可能是最实用的风格。
在第二个中你得到 B
如果你需要分析数据,它更容易使用; n.b。 @views
需要 Julia 0.6,但可以省略。
第三个可能是最容易理解的。
正如另一个答案中提到的,可以在 Julia 中使用相同的方法,即 scatter(zip(A...)...)
,但这对于较大的向量来说非常慢,应该是避免了。
另一种可能性是使用 getindex.(A, i)
来获取 A
.
i
个元素的向量
julia> A = [[i, 10i] for i=1:5]
5-element Array{Array{Int64,1},1}:
[1, 10]
[2, 20]
[3, 30]
[4, 40]
[5, 50]
julia> getindex.(A,1)
5-element Array{Int64,1}:
1
2
3
4
5
julia> getindex.(A,2)
5-element Array{Int64,1}:
10
20
30
40
50