Я новичок в 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» способ сделать это?
Предварительное выделение 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 транслируется, чтобы соответствовать этой форме.