26

Pythonで2D配列を作成する最良の方法は何ですか?

私が欲しいのは、次のような値を保存することです:

X , Y , Z

X[2],Y[2],Z[2]またはX[n],Y[n],Z[n]where nis variableのようなデータにアクセスできるようにします。最初は大きさがわからないnので、最後に値を追加したいと思います。

4

8 に答える 8

22
>>> 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]]
>>>
于 2009-05-13T09:29:01.763 に答える
11

何をしているかによっては、実際には 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 には非常に多くのコレクション クラスがあります。マトリックスよりも興味深いものがある可能性は高いです。

于 2009-05-13T10:21:14.860 に答える
9

Python では、通常、この目的のためにリストを使用します。リストは任意にネストできるため、2D 配列を作成できます。すべてのサブリストが同じサイズである必要はないため、他の問題は解決します。私がリンクした例を見てください。

于 2009-05-13T09:28:51.917 に答える
7

配列で本格的な作業を行いたい場合は、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 配列は非常に小さいため、タプルを使用する場合と比較してオーバーヘッドがあると思います。それはすべてあなたの優先順位に依存します。

かなり似ているこの他の質問も参照してください(可変サイズは別として)。

于 2009-05-13T09:42:42.457 に答える
5

次のような辞書を使用することをお勧めします。

arr = {}

arr[1] = (1, 2, 4)
arr[18] = (3, 4, 5)

print(arr[1])
>>> (1, 2, 4)

エントリがディクショナリで定義されているかどうかわからない場合は、「arr[x]」を呼び出すときに、try-except などの検証メカニズムが必要になります。

于 2009-05-13T10:47:14.410 に答える
3

メモリ フットプリントが気になる場合は、Python 標準ライブラリにarray モジュールが含まれています。これらの配列には、同じ型の要素が含まれています。

于 2009-05-13T12:33:18.637 に答える
0

次のコードを考慮してください。

from numpy import zeros
scores = zeros((len(chain1),len(chain2)), float)
于 2015-06-12T07:13:45.427 に答える