Pythonic способ создания двумерного массива - PullRequest
1 голос
/ 22 марта 2011

У меня есть функция gen(), которая возвращает массив значений nElements с плавающей точкой. Я ищу более Pythonic (один лайнер?) Способ сделать следующее:

a = zeros((nSamples, nElements))
for i in xrange(nSamples):
     a[i,:] = gen()

Это один из способов сделать это:

a = array([gen() for i in xrange(nSamples)]).reshape((nSamples, nElements))

Но по понятным причинам он немного медленнее из-за того, что предварительно не выделяет массив numpy:

import time
from numpy import *

nSamples  = 100000
nElements = 100

start = time.time()
a = array([gen() for i in xrange(nSamples)]).reshape((nSamples, nElements))
print (time.time() - start)

start = time.time()
a = zeros((numSamples, nElements))
for i in xrange(numSamples):
    a[i,:] = gen()
print (time.time() - start)

Выход:

1.82166719437
0.502261161804

Итак, есть ли способ добиться того же однострочного, сохраняя предварительно выделенный массив для скорости?

Спасибо
-Nate

Ответы [ 2 ]

9 голосов
/ 22 марта 2011

Это может не дать прямого ответа на ваш вопрос, но поскольку вы упомянули Pythonic в названии ... Пожалуйста, поймите, что Pythonic не обязательно является "однострочником" илисамый умный и короткий (по нажатию клавиши) способ сделать что-то.Наоборот, код Pythonic стремится к ясности.

В случае с вашим кодом я нахожу:

a = zeros((nSamples, nElements))
for i in xrange(nSamples):
     a[i,:] = gen()

Намного яснее, чем:

a = array([gen() for i in xrange(nSamples)]).reshape((nSamples, nElements))

Поэтому я бы не сказал, что второй код более Pythonic,Вероятно, менее.

0 голосов
/ 22 марта 2011

Я верю, что это будет делать то, что вы хотите:

a = vstack([ gen() for _ in xrange(nSamples) ])

, так как у меня нет доступа к вашей gen функции, я не могу провести тестирование времени. Кроме того, это (как и ваша однострочная) не так благоприятно для памяти, как ваша версия для цикла. однострочники хранят все выходные данные gen() и затем создают массив, тогда как цикл for должен иметь в памяти только один gen() за один раз (вместе с пустым массивом).

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