2009-12-07 24 views
20

それほど難しいはずがありません。私はPythonで整数配列を作成するには?

int a[10]; 

はあなたが必要とするすべてである、Cで意味します。任意のサイズのすべての0の配列を作成する方法。私はNumPyのゼロ()関数を知っていますが、別のモジュールではなく、簡単な方法で組み込む必要があります。

+1

Pythonは組み込みの配列を持っていません。それに最も近いのはリストです。 – int3

+3

驚いたことに、誰も実際にあなたが必要とするものを求めていません。通常、リストは他のものを格納することができるという事実にかかわらず、大丈夫です(他のオブジェクトへの参照のリストだけです)。しかし、多分あなたのためにうまくいかない理由があります。 –

+2

Pythonチュートリアルを強くお勧めします:http://docs.python.org/tutorial/あなたの時間はわずか2時間です。 –

答えて

20

あなたが(彼らは何が含まれていると、あまりにも多くのメモリを取ることができるので)リストに満足できない場合は、整数の効率的な配列を使用することができます:あなたが初期化する必要がある場合はhere

を参照してください

import array 
array.array('i') 

をそれは、

a = array.array('i',(0 for i in range(0,10))) 
+1

これは、10個ではなく9個の要素で配列を初期化します。 –

+0

これは最も効率的な方法です。 –

+0

変更された9から10( - : –

6
>>> a = [0] * 10 
>>> a 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
1
a = 10 * [0] 

あなたにゼロで満たされた長さ10の配列を、提供します。

+3

これはPythonで配列と呼ばれるものではなく、リストである –

+0

質問者がCから「配列」という用語を取り、Pythonで密接な組み込みの代替を探すと思います。多くの場合、Pythonでリストを使用するだけです。 – catchmeifyoutry

+0

catchmeifyoutry:私はまだ質問者に、Cの代替案が何であっても、 –

22

二つの方法:

x = [0] * 10 
x = [0 for i in xrange(10)] 

編集:別のリストを作成しないようにxrangerangeを置き換えます。

他にも多くの人がPiとBen Jamesを含めて指摘しているように、これはlistであり、Python配列ではありません。多くの場合、十分な、そして容易なリストではあるが、パフォーマンスが重視される用途(例えば何千ものオブジェクトに複製されている場合)では、Python配列を調べることができる。このスレッドの他の答えで説明されているように、arrayモジュールを調べます。

+2

これはリストです。整数だけでなく、あらゆるタイプのオブジェクトを含めることができます。そして、整数に必要以上に多くのRAMを使用します。 –

+1

それだけでなく、rangeもリストを返します。したがって、2番目の行は少なくとも結果のリストの2倍のメモリを使用します。 –

+2

リストを乗算するときは注意してください。変更可能なオブジェクトには問題があります。乗算はアイテムを複製するのではなく、リスト内に複数回出現する非常に同じオブジェクトを与えるだけです。これを試してみましょう: 'a = [[1]] * 3; a [1] .append(2) '。したがって、 'a [1]'に追加すると、aのすべての項目が実際に変更され、 '[[1,2]、[1,2]、[1,2]]'が得られます。 – badp

6

配列モジュールを使用してください。これにより、同じタイプのコレクションを効率的に格納できます。

>>> import array 
>>> import itertools 
>>> a = array_of_signed_ints = array.array("i", itertools.repeat(0, 10)) 

異なるタイプの場合は、the documentation of the array moduleをご覧ください。最大100万エントリまで、これはかなり気分がいいはずです。 1000万エントリの場合、私のローカルマシンは1.5秒間考えます。

array.array の2番目のパラメータは、それが読み取られるように規定された配列を構築ジェネレータ、です。このようにして、配列モジュールはゼロを1つずつ消費できますが、ジェネレータは定数メモリのみを使用します。シーケンスが長くなると、このジェネレータは大きくなりません(メモリワイズ)。アレイはもちろん成長しますが、それは明らかです。

あなただけのリストのようにそれを使用します。

>>> a.append(1) 
>>> a.extend([1, 2, 3]) 
>>> a[-4:] 
array('i', [1, 1, 2, 3]) 
>>> len(a) 
14 

...または単にリストに変換します

>>> l = list(a) 
>>> len(l) 
14 

驚くべきことに

>>> a = [0] * 10000000 

がより建設に高速であります配列メソッドGo figure!:)

1
import random 

def random_zeroes(max_size): 
    "Create a list of zeros for a random size (up to max_size)." 
    a = [] 
    for i in xrange(random.randrange(max_size)): 
    a += [0] 

利用代わりrangeあなたは、Python 3.xを使用している場合、

1

アレイを高速に初期化する必要がある場合は、ジェネレータイニシャライザではなくブロックで行うことができます。これははるかに高速です。 [0]*countでリストを作成することは、それと同じくらい速いです。

import array 

def zerofill(arr, count): 
    count *= arr.itemsize 
    blocksize = 1024 
    blocks, rest = divmod(count, blocksize) 
    for _ in xrange(blocks): 
     arr.fromstring("\x00"*blocksize) 
    arr.fromstring("\x00"*rest) 

def test_zerofill(count): 
    iarr = array.array('i') 
    zerofill(iarr, count) 
    assert len(iarr) == count 

def test_generator(count): 
    iarr = array.array('i', (0 for _ in xrange(count))) 
    assert len(iarr) == count 

def test_list(count): 
    L = [0]*count 
    assert len(L) == count 

if __name__ == '__main__': 
    import timeit 
    c = 100000 
    n = 10 
    print timeit.Timer("test(c)", "from __main__ import c, test_zerofill as test").repeat(number=n) 
    print timeit.Timer("test(c)", "from __main__ import c, test_generator as test").repeat(number=n) 
    print timeit.Timer("test(c)", "from __main__ import c, test_list as test").repeat(number=n) 

結果:

(array in blocks) [0.022809982299804688, 0.014942169189453125, 0.014089107513427734] 
(array with generator) [1.1884641647338867, 1.1728270053863525, 1.1622772216796875] 
(list) [0.023866891860961914, 0.035660028457641602, 0.023386955261230469] 
+0

興味深いことに、Pythonは本当に初期化を最適化します。私はubuntu (ブロックの配列)[0.0191、0.0180、0.0170] (ジェネレータを含む配列)[0.9199、0.9179、0.6761] (リスト)[0.0069、0.0074:9.04、Pythonの2.6.2(I出力少し切り捨て) 、0.0064] 私のマシンリストではかなり速いです。 izer.se、どのOS/pythonを実行していますか? – catchmeifyoutry

+0

これは私の老いたiBookからのもので、Debian/Linuxを実行しているPowerPC G4の5歳のラップトップです。間違いなく、より速いマシンが周囲にあります:-) – u0b34a0f6ae

+0

私のポイントは私たちのマシンを比較するのではなく、マシンの時差を比較することです。あなたの結果は多かれ少なかれ(ブロックで配列されています)、リストと同じ速さで表示されますが、私のマシン(またはPythonの実装)では(リスト)メソッドがより高速です。 – catchmeifyoutry

関連する問題