Hoe maak je een integer array in Python?

Het zou niet zo moeilijk moeten zijn. Ik bedoel in C,

int a[10]; 

is alles wat je nodig hebt. Hoe maak je een array van allemaal nullen voor een willekeurige grootte. Ik ken de functie nullen() in NumPy, maar er moet een gemakkelijke manier ingebouwd zijn, geen andere module.


Antwoord 1, autoriteit 100%

Als u niet tevreden bent met lijsten (omdat ze van alles kunnen bevatten en te veel geheugen in beslag nemen), kunt u een efficiënte reeks gehele getallen gebruiken:

import array
array.array('i')

Zie hier

Als je het moet initialiseren,

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

Antwoord 2, autoriteit 91%

twee manieren:

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

Bewerken: rangevervangen door xrangeom te voorkomen dat er nog een lijst moet worden gemaakt.

Ook: zoals vele anderen hebben opgemerkt, waaronder Pi en Ben James, creëert dit een list, geen Python-array. Hoewel een lijst in veel gevallen voldoende en gemakkelijk genoeg is, kunt u voor prestatiekritieke toepassingen (bijvoorbeeld wanneer ze worden gedupliceerd in duizenden objecten) in python-arrays kijken. Zoek de module arrayop, zoals uitgelegd in de andere antwoorden in deze thread.


Antwoord 3, autoriteit 29%

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

4, Autoriteit 6%

a = 10 * [0]

geeft u een scala aan lengte 10, gevuld met nullen.


5, Autoriteit 3%

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]

Gebruik rangein plaats als u gebruik maakt Python 3.x.


6, Autoriteit 3%

Als u een array snel initialiseren, kunt u dit doen door blokken in plaats van met een generator initialiseerder, en het gaat veel sneller. Het creëren van een lijst met [0]*countis net zo snel, nog steeds.

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)

Resultaten:

(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]

7, Autoriteit 3%

import numpy as np
new_array=np.linspace(0,10,11).astype('int')

Een alternatief voor het gieten van het type wanneer de array is gemaakt.

Other episodes