Это не должно быть так сложно. Я имею в виду в C,
int a[10];
- это все, что вам нужно. Как создать массив всех нулей для случайного размера. Я знаю функцию zeros() в NumPy, но должен быть простой способ встроенного, а не другого модуля.
Это не должно быть так сложно. Я имею в виду в C,
int a[10];
- это все, что вам нужно. Как создать массив всех нулей для случайного размера. Я знаю функцию zeros() в NumPy, но должен быть простой способ встроенного, а не другого модуля.
Если вас не устраивают списки (потому что они могут содержать что угодно и занимать слишком много памяти), вы можете использовать эффективный массив целых чисел:
import array
array.array('i')
Смотрите здесь
Если вам нужно его инициализировать,
a = array.array('i',(0 for i in range(0,10)))
двумя способами:
x = [0] * 10
x = [0 for i in xrange(10)]
Изменить: заменить range
на xrange
, чтобы избежать создания другого списка.
Также: как и многие другие, включая Pi и Ben James, это создает list
, а не массив Python. Хотя список во многих случаях достаточно и достаточно прост, для критически важных применений (например, при дублировании в тысячах объектов) вы можете просматривать массивы python. Посмотрите модуль array
, как описано в других ответах в этом потоке.
>>> a = [0] * 10
>>> a
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Используйте модуль массива. С его помощью вы можете эффективно хранить коллекции того же типа.
>>> import array
>>> import itertools
>>> a = array_of_signed_ints = array.array("i", itertools.repeat(0, 10))
Для получения дополнительной информации - например, различные типы, посмотрите документацию о модуле массива. Для до 1 миллиона записей это должно быть довольно быстро. За 10 миллионов записей моя локальная машина думает в течение 1,5 секунд.
Второй параметр array.array - это генератор, который строит определенную последовательность по мере ее чтения. Таким образом, модуль массива может потреблять нули один за другим, но генератор использует только постоянную память. Этот генератор не становится больше (по памяти), если последовательность становится длиннее. Массив будет расти, конечно, но это должно быть очевидно.
Вы используете его точно так же, как список:
>>> 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
быстрее при построении, чем метод массива. Иди цифра!:)
a = 10 * [0]
дает массив длиной 10, заполненный нулями.
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.
Если вам нужно быстро инициализировать массив, вы можете сделать это с помощью блоков вместо инициализатора генератора, и это будет намного быстрее. Создание списка с помощью [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]
import numpy as np
new_array=np.linspace(0,10,11).astype('int')
Альтернатива для приведения типа при создании массива.