13

Python では、ネストされたリスト内包表記を実行できます。たとえば、次の配列をフラット化できます。

a = [[1,2,3],[4,5,6]]
[i for arr in a for i in arr]

取得するため[1,2,3,4,5,6]

Julia でこの構文を試すと、次のようになります。

julia> a
([1,2,3],[4,5,6],[7,8,9])

julia> [i for arr in a for i in arr]
ERROR: syntax: expected ]

Juliaのネストされたリスト内包表記は可能ですか?

4

5 に答える 5

21

この機能は Julia v0.5 で追加されました。

julia> a = ([1,2,3],[4,5,6],[7,8,9])
([1,2,3],[4,5,6],[7,8,9])

julia> [i for arr in a for i in arr]
9-element Array{Int64,1}:
 1
 2
 3
 4
 5
 6
 7
 8
 9
于 2016-08-25T19:36:57.050 に答える
15

Julia では、リスト内包表記の動作が少し異なります。

> [(x,y) for x=1:2, y=3:4]
2x2 Array{(Int64,Int64),2}:
 (1,3)  (1,4)
 (2,3)  (2,4)

a=[[1 2],[3 4],[5 6]]多次元配列の場合、vecそれを平坦化します:

> vec(a)
6-element Array{Int64,1}:
 1
 2
 3
 4
 5
 6

a にはタプルが含まれているため、これは Julia ではもう少し複雑です。これは機能しますが、おそらくそれを処理する最良の方法ではありません。

function flatten(x, y)
    state = start(x)
    if state==false
        push!(y, x)
    else
        while !done(x, state) 
          (item, state) = next(x, state) 
          flatten(item, y)
        end 
    end
    y
end
flatten(x)=flatten(x,Array(Any, 0))

次に、次を実行できます。

> flatten([(1,2),(3,4)])
4-element Array{Any,1}:
 1
 2
 3
 4
于 2014-01-15T05:52:16.060 に答える
1

ベクトルのタプルを使用している理由は何ですか? Ben が既にvec. しかし、どちらの場合でも非常に単純に内包表記を使用することもできます:

julia> a = ([1,2,3],[4,5,6],[7,8,9]);
julia> [i for i in hcat(a...)]
9-element Array{Any,1}:
 1
 2
 ⋮

hcat(a...)はタプルを「はじき飛ばし」、それを連結して配列にします。ただし、Python とは異なり、Julia は列優先の配列セマンティクスを使用することに注意してください。タプルには 3 つの列ベクトルがあります。それはあなたの意図ですか?(スペースで区切られた行ベクトルの場合[a...]は、連結を行うために使用できます)。配列は、次元に関係なく、すべての要素に対して反復処理されます。

于 2014-01-15T18:30:16.043 に答える