То, что вы делаете, является стандартным способом. Свойство массивов numpy состоит в том, что им нужна непрерывная память. Единственная возможность "дыр", о которой я могу думать, возможна с strides
членом PyArrayObject
, но это не влияет на обсуждение здесь. Поскольку числовые массивы имеют непрерывную память и «предварительно выделены», добавление новой строки / столбца означает выделение новой памяти, копирование данных, а затем освобождение старой памяти. Если вы делаете это много, это не очень эффективно.
Один случай, когда кто-то, возможно, не захочет создавать список и затем преобразовывать его в массив с нуля, в конце концов, когда список содержит много чисел: массив с числовыми данными занимает гораздо меньше места, чем собственный список Python числа (так как собственный список Python хранит объекты Python). Для ваших типичных размеров массивов, я не думаю, что это проблема.
Когда вы создаете свой окончательный массив из списка массивов, вы копируете все данные в новое место для нового (в вашем примере 2-го) массива. Это все еще намного эффективнее, чем иметь массив numpy и делать next = numpy.vstack((next, new_row))
каждый раз, когда вы получаете новые данные. vstack()
скопирует все данные для каждой "строки".
Некоторое время назад в списке рассылки numpy-для обсуждения существовал поток, в котором обсуждалась возможность добавления нового типа массива numpy, который позволяет эффективно расширять / добавлять. Кажется, в то время это вызывало значительный интерес, хотя я не знаю, получилось ли что-то из этого. Возможно, вы захотите взглянуть на эту тему.
Я бы сказал, что то, что вы делаете, является очень питонским и эффективным, поэтому, если вам действительно не нужно что-то еще (может быть, больше эффективности пространства), с вами все будет в порядке. Именно так я создаю свои массивы numpy, когда в начале не знаю количество элементов в массиве.