Каков предпочтительный способ предварительного выделения массивов NumPy? - PullRequest
19 голосов
/ 16 августа 2010

Я новичок в 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» способ сделать это?

1 Ответ

20 голосов
/ 16 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...