Correct way to (un)zip arrays in Julia

只愿长相守 提交于 2019-12-23 10:39:32

问题


I was using the PyPlot library in Julia for plotting, and the scatter function seems to have a "little" inconvenience, namely, that only accepts the coordinates as two arguments: one array for all x values, and another for all y values, i.e.

scatter(xxs,yys)

with x=[x1,x2,...], and y=[y1,y2,...].

If I have a set or a tuple with points of coordinates, like,

A=([x1,y1],[x2,y2],...)

using pyplot/matplotlib directly in Python solves the inconvenience in one liner, as atested here in StackOverflow:

plt.scatter(*zip(*li))

but it seems that zip on Julia works completely different. Until now, I have come with following solution, but it seems quite inelegant:

x=[]
y=[]
for j in selectos
  append!(x,j[2])
   append!(y,j[1])
end

scatter(x,y, marker="o",c="black")

Is there a more "functional" or one-liner (or two liner) approach?


回答1:


As mentioned in the other answer, one can use the same approach in Julia, i.e., scatter(zip(A...)...), but this is very slow for larger vectors and should be avoided.

Another possibility is to use getindex.(A, i) to get a vector of all ith elements of the vectors in A.

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



回答2:


I can think of three approaches:

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])

The first one is probably most functional style.

In the second one you get B which is easier to work with if you need to analyze the data; n.b. @views requires Julia 0.6, but it can be omitted.

The third is probably the simplest to understand.



来源:https://stackoverflow.com/questions/44010033/correct-way-to-unzip-arrays-in-julia

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!