самый быстрый способ заполнить массив 1D NumPy - PullRequest
5 голосов
/ 02 декабря 2011

Я видел вопросы, похожие на это, но не один, непосредственно касающийся проблемы. Я рассчитал следующие два способа заполнения массива, и половину времени с помощью np.zeros () выполняем быстрее, а половину времени выполняем напрямую, быстрее. Есть ли предпочтительный способ? Я довольно новичок в использовании массивов numpy, и я стал заниматься с целью ускорения моего кода, не слишком задумываясь о читабельности.

import numpy as np
import time

lis = range(100000)

timer = time.time()
list1 = np.array(lis)
print 'normal array creation', time.time() - timer, 'seconds'

timer = time.time()
list2 = np.zeros(len(lis))
list2.fill(lis)
print 'zero, fill - array creation', time.time() - timer, 'seconds'

Спасибо

Ответы [ 4 ]

5 голосов
/ 02 декабря 2011

Если у вас есть список с плавающей точкой a=[x/10. for x in range(100000)], то вы можете создать массив с помощью:

np.array(a) # 9.92ms
np.fromiter(a, dtype=np.float) # 5.19ms

Ваш подход

list2 = np.zeros(len(lis))
list2.fill(lis)

не будет работать, как ожидалось. .fill заполняет весь массив одним значением.

2 голосов
/ 05 мая 2012

np.fromiter предварительно выделит выходной массив, если задано количество элементов:

a = [x/10. for x in range(100000)] # 10.3ms
np.fromiter(a, dtype=np.float) # 3.33ms
np.fromiter(a, dtype=np.float, count=100000) # 3.03ms
1 голос
/ 02 декабря 2011

Первый список можно создать быстрее с помощью функции arange numpy:

list3 = np.arange(100000)

Вы также можете найти полезной функцию linspace.

1 голос
/ 02 декабря 2011

Ваш пример list2 просто не работает - если вы проверите list2, вы обнаружите, что он все еще содержит все нули.Я считаю, что достижение читабельности - это не просто хорошая цель сама по себе.Это также приводит к увеличению вероятности правильного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...