【问题标题】:Correct way to (un)zip arrays in Julia在 Julia 中(解)压缩数组的正确方法
【发布时间】:2017-05-16 19:30:04
【问题描述】:

我在 Julia 中使用 PyPlot 库进行绘图,而 scatter 函数似乎有一个“小”不便之处,即只接受坐标作为两个参数:一个数组用于所有 x 值,另一个用于所有 y值,即

scatter(xxs,yys)

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

如果我有一个带有坐标点的集合或元组,例如,

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

直接在 Python 中使用 pyplot/matplotlib 解决了一个班轮的不便,正如 here in StackOverflow 所证明的那样:

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

是否有更“实用”或单线(或两线)的方法?

【问题讨论】:

标签: list julia scatter


【解决方案1】:

正如另一个答案中提到的,可以在 Julia 中使用相同的方法,即 scatter(zip(A...)...),但对于较大的向量,这非常很慢,应该避免。

另一种可能性是使用getindex.(A, i) 获取A 中向量的所有ith 元素的向量。

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】:

    我能想到三种方法:

    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,如果你需要分析数据,它更容易使用;注意@views 需要 Julia 0.6,但可以省略。

    第三种可能是最容易理解的。

    【讨论】:

    • 功能风格的第三个选项的可读性可能不太好:scatter(map(i -> map(x -> x[i], A),1:2)...)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多