У меня есть массивы формы n
(86,)
У меня пустой массив
complete = np.array([])
К которому я хочу добавить эти массивы n. Когда я делаю это прямо сейчас, используя это
complete = np.append(complete, feature_1)
когда я продолжаю добавлять изменения формы массива в (172,), (258) ... и т. д., но я хотел бы добавить его таким образом, чтобы он выглядел как (1, 86), (2, 86), (3, 86) и т. д., что привело бы к окончательной форме, я бы хотел (n, 86).
Любые предложения о том, как я могу достичь этого, были бы полезны. Заранее спасибо.
@ roganjosh Заглянет в это
Я думаю ты хочешь vstack
Опубликуйте небольшой пример вашего массива фигур.
@kabanus форма моего массива - (86,), и у меня их 128, поэтому я хотел бы пройти через эти массивы и получить форму (128, 86), надеюсь, я здесь ясно
Я удалил свой первоначальный комментарий, но считаю, что этот принцип стоит сохранить. Не подходите к массивам numpy как к спискам, добавление требует выделения целого нового массива и памяти. Это подразумевается при создании экземпляра пустого массива. Это действительно очень неэффективно. Возможно, лучше заранее создать массив с правильными размерами, например. используя np.empty(), а затем присваивая строки.
Не думаю, что я ясно сформулировал вопрос. Внес правки, чтобы изменить это.
@ raganjosh будет иметь это в виду
В какой структуре сейчас хранятся эти массивы? Предположительно массивы n находятся в каком-то контейнере. Или они названы индивидуально? Мне любопытно, есть ли у нас что-то, что нужно перебирать для доступа к каждому отдельному массиву.
Массивы n нигде не хранятся, но каждая итерация будет создавать массив ith из n .
вы видели, что np.append говорит о параметре оси?
не используйте np.concatenate или np.append в цикле. list append лучше.
Я не проверял параметр оси np.append






Думаю, вам лучше создать пустой 2D-массив и заполнить его позже ...
import numpy as np
N = how_many()
L = how_long()
complete = np.empty((N, L), dtype=float)
for i in range(N):
complete(i, :) = extract_feature(i)
Вместо dtype=float вы можете использовать другой числовой тип, если этого требует ваша проблема.
Например.,
In [14]: a = np.empty((2,4), dtype=float)
In [15]: for i in (0, 1):
...: a[i,:] = np.ones(4)*i
...:
In [16]: a
Out[16]:
array([[0., 0., 0., 0.],
[1., 1., 1., 1.]])
Прокомментируйте эффективность Если заранее известны размеры массива, который они собираются построить построчно, подход, описанный выше, лучше, потому что он позволяет избежать постоянного выделение новой памяти, копирование временного результата и новой строки в новую память и освобождение памяти, использованной для хранения предыдущего временного результата.
Альтернатива с использованием конкатенации Если, с другой стороны, заранее неизвестно, сколько строк будет создано во время создания массива, или если кто-то настаивает на использовании неоптимального решения, они могут использоватьnp.vstack, инкапсуляция продукции новых строк в генератор
import numpy as np
def features_factory(stuff):
while true:
feature = new_feature(stuff)
if feature:
yield feature
else:
return
complete = np.vstack(features_factory(todays_stuff))
Например.,
In [1]: import numpy as np
In [2]: np.random.seed((2018+7+8)) # today's stuff... ;)
In [3]: def features_factory(stuff):
...: n = 0
...: while True:
...: if n<stuff:
...: yield np.ones(5)*n
...: n = n+1
...: else:
...: return
In [4]: complete = np.vstack(features_factory(np.random.randint(5,11)))
In [5]: complete
Out[5]:
array([[0., 0., 0., 0., 0.],
[1., 1., 1., 1., 1.],
[2., 2., 2., 2., 2.],
[3., 3., 3., 3., 3.],
[4., 4., 4., 4., 4.],
[5., 5., 5., 5., 5.],
[6., 6., 6., 6., 6.],
[7., 7., 7., 7., 7.]])
In [6]:
позволь мне проверить это
это решение работает
Это не только работает, но и эффективно, потому что итерация за итерацией не выполняется, чтобы 1. выделить новую память 2. скопировать то, что было сделано до сих пор, и 3. пометить для сборки мусора память, которая использовалась ранее. .
Привет, вы думаете, чего я хочу достичь, можно сделать и с помощью операции конкатенации? Я имею в виду, как я продолжаю конкатенацию массива?
На данный момент эффективность не входит в мой список приоритетов.