эффективное преобразование массива python в numpy - PullRequest
22 голосов
/ 15 апреля 2011

Я получаю большой массив (изображение с 12 Mpix) в формате массива из стандартной библиотеки Python.Так как я хочу выполнить операции с этим массивом, я хочу преобразовать его в массив numpy.Я попробовал следующее:

import numpy
import array
from datetime import datetime
test = array.array('d', [0]*12000000)
t = datetime.now()
numpy.array(test)
print datetime.now() - t

Я получаю результат в течение одной или двух секунд: эквивалентно циклу в python.

Есть ли более эффективный способ сделать это преобразование?

Ответы [ 2 ]

49 голосов
/ 15 апреля 2011
np.array(test)                                       # 1.19s

np.fromiter(test, dtype=int)                         # 1.08s

np.frombuffer(test)                                  # 459ns !!!
1 голос
/ 29 мая 2019

asarray(x) - почти всегда лучший выбор для любого объекта, подобного массиву.

array и fromiter медленные, потому что выполняют копирование. Использование asarray позволяет удалить эту копию:

>>> import array
>>> import numpy as np
>>> test = array.array('d', [0]*12000000)
# very slow - this makes multiple copies that grow each time
>>> %timeit np.fromiter(test, dtype=test.typecode)
626 ms ± 3.97 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

# fast memory copy
>>> %timeit np.array(test)
63.5 ms ± 639 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

# which is equivalent to doing the fast construction followed by a copy
>>> %timeit np.asarray(test).copy()
63.4 ms ± 371 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

# so doing just the construction is way faster
>>> %timeit np.asarray(test)
1.73 µs ± 70.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

# marginally faster, but at the expense of verbosity and type safety if you
# get the wrong type
>>> %timeit np.frombuffer(test, dtype=test.typecode)
1.07 µs ± 27.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

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