Подтвердить что ты не робот

Каков предпочтительный способ переназначения массивов 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)

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

np.zeros((8,5))

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

4b9b3361

Ответ 1

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

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