web-dev-qa-db-ja.com

Juliaで配列の配列を初期化する

2つの配列の配列を作成しようとしています。ただし、_a = [[1, 2], [3, 4]]_はそれを行わず、実際に配列を連結します。これはジュリアにも当てはまります:_[[1, 2], [3, 4]] == [1, 2, 3, 4]_。何か案が?

一時的な回避策として、Push!(Push!(Array{Int, 1}[], a), b)を使用します。

30
fhucho

行列ではなく配列の配列が必要な場合(つまり、2次元のArray):

a = Array[ [1,2], [3,4] ]

[]の前に型を置くことにより、Arrayリテラルをパラメーター化(要素の型を指定)できます。したがって、ここではArrayリテラルをArrayタイプでパラメーター化しています。これにより、リテラル宣言内の角括弧の解釈が変わります。

22
Sean Mackesey

Sean Mackeseyの答えは、タイプArray{Array{T,N},1}(またはArray{Array{Int64,N},1}の前にタイプを置く場合は[])の何かを与えます。代わりに、より強く型付けされたもの、たとえばIntのvectorsのベクトル(つまり、Array{Array{Int64,1},1})が必要な場合は、以下を使用します。

a = Vector{Int}[ [1,2], [3,4] ]
15
Jim Garrison

Julia v0.5では、元の構文で目的の結果が生成されます。

Julia> a = [[1, 2], [3, 4]]
2-element Array{Array{Int64,1},1}:
 [1,2]
 [3,4]

Julia> VERSION
v"0.5.0"
13

タイプArrayの配列の作成に関する一般的な回答は、次のとおりです。

Juliaでは、他の配列型オブジェクトを保持する配列を持つことができます。さまざまなタイプの配列を初期化する次の例を検討してください。

_A = Array{Float64}(10,10)  # A single Array, dimensions 10 by 10, of Float64 type objects

B = Array{Array}(10,10,10)  # A 10 by 10 by 10 Array.  Each element is an Array of unspecified type and dimension.

C = Array{Array{Float64}}(10)  ## A length 10, one-dimensional Array.  Each element is an Array of Float64 type objects but unspecified dimensions

D = Array{Array{Float64, 2}}(10)  ## A length 10, one-dimensional Array.  Each element of is an 2 dimensional array of Float 64 objects
_

たとえば、CとDの違いをここで考えてみましょう。

_Julia> C[1] = Rand(3)
3-element Array{Float64,1}:
 0.604771
 0.985604
 0.166444

Julia> D[1] = Rand(3)
ERROR: MethodError: 
_

Rand(3)は、タイプ_Array{Float64,1}_のオブジェクトを生成します。 Cの要素の唯一の仕様は、Float64型の要素を持つ配列であるということなので、これはCの定義に適合します。ただし、Dの場合、要素は2次元配列でなければならないことを指定しました。したがって、Rand(3)は2次元配列を生成しないため、これを使用してDの特定の要素に値を割り当てることはできません

配列内の配列の特定の次元を指定

配列が配列型の要素を保持することを指定できますが、それを指定することもできます。これらの要素は2次元配列である必要があります。これらの要素の次元を直接指定することはできません。例えば。それぞれが5,5である10個の配列を保持する配列が必要であることを直接指定することはできません。これは、配列の作成に使用されるArray()関数の構文から確認できます。

Array {T}(dims)

要素タイプTの初期化されていない密配列を構築します。dimsはタプルまたは一連の整数引数です。構文Array(T、dims)も使用できますが、非推奨です。

Juliaの配列のタイプには、次元の数は含まれますが、それらの次元のサイズは含まれません。したがって、この構文には正確な寸法を指定する場所がありません。それでも、配列内包表記を使用すると、同様の効果を得ることができます。

_E = [Array{Float64}(5,5) for idx in 1:10]
_
8

おそらくマトリックスが必要です:

Julia> a = [1 2; 3 4]
2x2 Int64 Array:
 1  2
 3  4

多分タプル:

Julia> a = ([1,2],[3,4,5])
([1,2],[3,4,5])
2
juliohm

また、{[1,2], [3,4]}を実行して、Array{Any,1}の代わりに[1,2][3,4]を含むArray{Array{T,N},1}を作成することもできます。

2
PythonNut

不思議に思う人のために、v0.7ではこれはかなり似ています。

Array{Array{Float64,1},2}(undef, 10,10)  #creates a two-dimensional array, ten rows and ten columns where each element is an array of type Float64

Array{Array{Float64, 2},1}(undef,10) #creates a one-dimensional array of length ten, where each element is a two-dimensional array of type Float64
1
Lotte Victor