【问题标题】:Julia Approach to python equivalent list of listsJulia 对 python 等效列表的方法
【发布时间】:2015-02-02 05:22:34
【问题描述】:

我刚开始对 Julia 进行修补,我真的很喜欢它。但是,我遇到了障碍。例如,在 Python 中(虽然不是很高效或 Pythonic),我会创建一个空列表并附加一个已知大小和类型的列表,然后转换为 NumPy 数组:

Python 片段

a = []
for ....
    a.append([1.,2.,3.,4.])

b = numpy.array(a)

我希望能够在 Julia 中做类似的事情,但我似乎无法弄清楚。这是我目前所拥有的:

朱莉娅 sn-p

a = Array{Float64}[]
for .....
    push!(a,[1.,2.,3.,4.])
end

结果是大小为 (n,) 的 n 元素 Array{Array{Float64,N},1},但我希望它是 nx4 Array{Float64,2}

有什么建议或更好的方法吗?

【问题讨论】:

标签: arrays julia


【解决方案1】:

你的代码的字面意思是

# Building up as rows
a = [1. 2. 3. 4.]
for i in 1:3
    a = vcat(a, [1. 2. 3. 4.])
end

# Building up as columns
b = [1.,2.,3.,4.]
for i in 1:3
    b = hcat(b, [1.,2.,3.,4.])
end

但这不是 Julia 的自然模式,你会做类似的事情

A = zeros(4,4)
for i in 1:4, j in 1:4
    A[i,j] = j
end

甚至

A = Float64[j for i in 1:4, j in 1:4]

基本上一次分配所有内存。

【讨论】:

  • 感谢您的意见,使用 hcat/vcat 可以解决问题。一次分配所有内存的问题是我不知道第一个维度的长度是多少;它会根据指定的条件增长。
【解决方案2】:

这是你想要的吗?

julia> a = Array{Float64}[]
0-element Array{Array{Float64,N},1}

julia> for i=1:3
           push!(a,[1.,2.,3.,4.])
       end

julia> a
3-element Array{Array{Float64,N},1}:
 [1.0,2.0,3.0,4.0]
 [1.0,2.0,3.0,4.0]
 [1.0,2.0,3.0,4.0]

julia> b = hcat(a...)'
3x4 Array{Float64,2}:
 1.0  2.0  3.0  4.0
 1.0  2.0  3.0  4.0
 1.0  2.0  3.0  4.0

似乎与python输出相匹配:

In [9]: a = []

In [10]: for i in range(3):
    a.append([1, 2, 3, 4])
   ....:

In [11]: b = numpy.array(a); b
Out[11]:
array([[1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4]])

我应该补充一点,这可能不是您真正想要做的,因为如果a 有很多元素,hcat(a...)' 可能会很昂贵。是否有理由不从一开始就使用二维数组?也许更多的问题背景(即您实际尝试编写的代码)会有所帮助。

【讨论】:

  • 这也有效!主要关注点是尝试构建一个第一维长度未知的数组;假设事先没有这方面的知识。数组的第一个维度将根据条件语句增长。
  • 对于附加的单个数组是 ND(而不是 1D),我们不知道 N 的情况,有什么办法可以做到这一点?问题是 Julia 似乎缺少一个通用的“将列表列表转换为 ND 数组”函数。因此,例如,如果数组是 2D,我们需要在末尾使用 cat(a,dims=3),如果数组是 3D,我们需要使用 cat(a,dims=4)。如果您只是尝试使用hcat(a),它将始终将结构折叠为二维,并且省略catdims 参数是错误的。我能看到的唯一解决方案是使用a = cat(a...,dims=length(size(a[1]))+1),不好。
【解决方案3】:

如果事先不知道循环迭代的次数,或者假设要合并的底层数组是一维的,则其他答案不起作用。似乎 Julia 缺少 的内置函数“获取这个 N-D 数组列表并返回一个新的 (N+1)-D 数组”

Julia 需要不同的连接解决方​​案,具体取决于基础数据的维度。因此,例如,如果a 的基础元素是向量,则可以使用hcat(a)cat(a,dims=2)。但是,如果a 是例如二维数组,则必须使用cat(a,dims=3) 等。catdims 参数不是可选的,并且没有指示“最后一维”的默认值。

这是一个模拟此用例的 np.array 功能的辅助函数。 (我称它为collapse 而不是array,因为它的行为方式与np.array 不太一样)

function collapse(x)
    return cat(x...,dims=length(size(x[1]))+1)
end

人们会使用它

a = []
for ...
    ... compute new_a...
    push!(a,new_a)
end
a = collapse(a)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多