在 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