Какой предпочтительный способ предварительного выделения массивов NumPy?

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

Например, чтобы добавить столбец 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)

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

np.zeros((8,5))

Каков «предпочтительный NumPy» способ сделать это?

21
задан kim busyn 16 August 2010 в 09:02
поделиться

1 ответ

Предварительное выделение mallocтирует всю необходимую память за один вызов, в то время как изменение размера массива (через вызовы append, insert, concatenate или resize) может потребовать копирования массива в больший блок памяти. Таким образом, вы правы, предварительное выделение предпочтительнее (и должно быть быстрее), чем изменение размера.

Существует несколько "предпочтительных" способов предварительного распределения массивов 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 транслируется, чтобы соответствовать этой форме.

21
ответ дан 29 November 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: