2013-06-28 6 views
4

Из того, что я читал о массивах Numpy, они более эффективны с точки зрения памяти, чем стандартные списки Python. Меня смущает то, что когда вы создаете массив numpy, вам нужно передать список python. Я предполагаю, что этот список python деконструирован, но для меня кажется, что он побеждает цель создания эффективной структуры данных с памятью, если вам нужно создать большую неэффективную структуру для создания эффективной.распределение памяти массива numpy

Означает ли numpy.zeros это?

ответ

6

Есть many ways to create a NumPy array. Передача списка Python в np.array или np.asarray - один из таких способов.

Другим способ заключается в использовании итератора:

In [11]: np.fromiter(xrange(10), count=10, dtype='float') 
Out[11]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) 

В этом случае нет большого временного списка Python участия. Поэтому вместо создания списка Python вы можете определить generator function, который дает элементы в списке. Затем, чтобы создать массив, вы должны передать генератору np.fromiter. Так как np.fromiter всегда создает 1D-массив, для создания массивов с более высоким размером используется reshape по возвращенному значению.

Существует также np.fromfunction, np.frombuffer, np.fromfile, np.loadtxt, np.genfromtxt, np.fromstring, np.zeros, np.empty и np.ones. Все это обеспечивает способы создания массивов NumPy без создания больших временных объектов Python.

1

В общем случае, если вы предварительно выделите размер, то это будет более эффективно. Если вы знаете, что собираетесь заполнять матрицу MxN ... сначала создайте ее, а не заполняйте, например, приложениями.

Несмотря на то, что список необходимо создать, большая часть эффективности достигается за счет воздействия на эту структуру. Чтение/запись/вычисления/и т.д..