Pythonで2D配列を作成する最良の方法は何ですか?
私が欲しいのは、次のような値を保存することです:
X , Y , Z
X[2],Y[2],Z[2]
またはX[n],Y[n],Z[n]
where n
is variableのようなデータにアクセスできるようにします。最初は大きさがわからないn
ので、最後に値を追加したいと思います。
Pythonで2D配列を作成する最良の方法は何ですか?
私が欲しいのは、次のような値を保存することです:
X , Y , Z
X[2],Y[2],Z[2]
またはX[n],Y[n],Z[n]
where n
is variableのようなデータにアクセスできるようにします。最初は大きさがわからないn
ので、最後に値を追加したいと思います。
>>> a = []
>>> for i in xrange(3):
... a.append([])
... for j in xrange(3):
... a[i].append(i+j)
...
>>> a
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
>>>
何をしているかによっては、実際には 2 次元配列を持っていない場合があります。
80% の確率で、適切なシーケンスである「行のようなオブジェクト」の単純なリストが表示されます。
myArray = [ ('pi',3.14159,'r',2), ('e',2.71828,'theta',.5) ]
myArray[0][1] == 3.14159
myArray[1][1] == 2.71828
多くの場合、それらはクラス、辞書、セット、または以前の言語にはなかった興味深いもののインスタンスです。
myArray = [ {'pi':3.1415925,'r':2}, {'e':2.71828,'theta':.5} ]
ペアでキー付けされた辞書を持っている時間の 20%
myArray = { (2009,'aug'):(some,tuple,of,values), (2009,'sep'):(some,other,tuple) }
まれに、実際に行列が必要になることがあります。
Python には非常に多くのコレクション クラスがあります。マトリックスよりも興味深いものがある可能性は高いです。
Python では、通常、この目的のためにリストを使用します。リストは任意にネストできるため、2D 配列を作成できます。すべてのサブリストが同じサイズである必要はないため、他の問題は解決します。私がリンクした例を見てください。
配列で本格的な作業を行いたい場合は、numpy ライブラリを使用する必要があります。これにより、たとえば、ベクトルの加算と行列の乗算を行うことができ、大きな配列の場合、Python リストよりもはるかに高速になります。
ただし、numpy では、サイズが事前定義されている必要があります。もちろん、numpy 配列を次のようにリストに格納することもできます。
import numpy as np
vec_list = [np.zeros((3,)) for _ in range(10)]
vec_list.append(np.array([1,2,3]))
vec_sum = vec_list[0] + vec_list[1] # possible because we use numpy
print vec_list[10][2] # prints 3
しかし、numpy 配列は非常に小さいため、タプルを使用する場合と比較してオーバーヘッドがあると思います。それはすべてあなたの優先順位に依存します。
かなり似ているこの他の質問も参照してください(可変サイズは別として)。
次のような辞書を使用することをお勧めします。
arr = {}
arr[1] = (1, 2, 4)
arr[18] = (3, 4, 5)
print(arr[1])
>>> (1, 2, 4)
エントリがディクショナリで定義されているかどうかわからない場合は、「arr[x]」を呼び出すときに、try-except などの検証メカニズムが必要になります。
メモリ フットプリントが気になる場合は、Python 標準ライブラリにarray モジュールが含まれています。これらの配列には、同じ型の要素が含まれています。
次のコードを考慮してください。
from numpy import zeros
scores = zeros((len(chain1),len(chain2)), float)