2010-08-16 2 views
18

Я новичок в NumPy/SciPy. Из документации представляется более целесообразным предустановить выделение одного массива вместо вызова append/insert/concatenate.Каков предпочтительный способ переназначения массивов NumPy?

Например, чтобы добавить колонку 1-х до массива, я думаю, что это:

ar0 = np.linspace(10, 20, 16).reshape(4, 4) 
ar0[:,-1] = np.ones_like(ar0[:,0]) 

предпочтительно это:

ar0 = np.linspace(10, 20, 12).reshape(4, 3) 
ar0 = np.insert(ar0, ar0.shape[1], np.ones_like(ar0[:,0]), axis=1) 

мой первый вопрос, является ли правильным (что первый лучше), и мой второй вопрос заключается в том, что на данный момент я просто предопределяю такие массивы (что я заметил в нескольких примерах Cookbook на сайте SciPy):

np.zeros((8,5)) 

Что такое способ «NumPy-preferred»?

ответ

17

Preallocation mallocs сохраняет всю необходимую память за один вызов, в то время как изменение размера массива (посредством вызовов для добавления, вставки, конкатенации или изменения размера) может потребовать копирования массива в больший блок памяти. Таким образом, вы правы, предпочтение предпочтительнее (и должно быть быстрее, чем) изменение размера.

Существует несколько «предпочтительных» способов предустановления массивов numpy в зависимости от того, что вы хотите создать. Существует np.zeros, np.ones, np.empty, np.zeros_like, np.ones_like и np.empty_like и многие другие, которые создают полезные массивы, такие как np.linspace и np.arange.

Так

ar0 = np.linspace(10, 20, 16).reshape(4, 4) 

просто отлично, если это происходит ближе к ar0 вы хотите.

Однако, чтобы сделать последний столбец все 1, я думаю, предпочтительный способ был бы просто сказать

ar0[:,-1]=1 

Поскольку форма ar0[:,-1] является (4,), то 1 является broadcasted в соответствии с этой формой.