Изменение формы массива numpy

У меня есть массивы формы n

(86,) 

У меня пустой массив

complete = np.array([])

К которому я хочу добавить эти массивы n. Когда я делаю это прямо сейчас, используя это

complete = np.append(complete, feature_1)

когда я продолжаю добавлять изменения формы массива в (172,), (258) ... и т. д., но я хотел бы добавить его таким образом, чтобы он выглядел как (1, 86), (2, 86), (3, 86) и т. д., что привело бы к окончательной форме, я бы хотел (n, 86).

Любые предложения о том, как я могу достичь этого, были бы полезны. Заранее спасибо.

На данный момент эффективность не входит в мой список приоритетов.

Ryan 07.07.2018 10:06

@ roganjosh Заглянет в это

Ryan 07.07.2018 10:07

Я думаю ты хочешь vstack

roganjosh 07.07.2018 10:07

Опубликуйте небольшой пример вашего массива фигур.

kabanus 07.07.2018 10:11

@kabanus форма моего массива - (86,), и у меня их 128, поэтому я хотел бы пройти через эти массивы и получить форму (128, 86), надеюсь, я здесь ясно

Ryan 07.07.2018 10:11

Я удалил свой первоначальный комментарий, но считаю, что этот принцип стоит сохранить. Не подходите к массивам numpy как к спискам, добавление требует выделения целого нового массива и памяти. Это подразумевается при создании экземпляра пустого массива. Это действительно очень неэффективно. Возможно, лучше заранее создать массив с правильными размерами, например. используя np.empty(), а затем присваивая строки.

roganjosh 07.07.2018 10:17

Не думаю, что я ясно сформулировал вопрос. Внес правки, чтобы изменить это.

Ryan 07.07.2018 10:18

@ raganjosh будет иметь это в виду

Ryan 07.07.2018 10:19

В какой структуре сейчас хранятся эти массивы? Предположительно массивы n находятся в каком-то контейнере. Или они названы индивидуально? Мне любопытно, есть ли у нас что-то, что нужно перебирать для доступа к каждому отдельному массиву.

roganjosh 07.07.2018 10:25

Массивы n нигде не хранятся, но каждая итерация будет создавать массив ith из n .

Ryan 07.07.2018 10:34

вы видели, что np.append говорит о параметре оси?

hpaulj 07.07.2018 17:29

не используйте np.concatenate или np.append в цикле. list append лучше.

hpaulj 07.07.2018 17:33

Я не проверял параметр оси np.append

Ryan 07.07.2018 17:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
13
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Думаю, вам лучше создать пустой 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]: 

позволь мне проверить это

Ryan 07.07.2018 11:47

это решение работает

Ryan 07.07.2018 13:40

Это не только работает, но и эффективно, потому что итерация за итерацией не выполняется, чтобы 1. выделить новую память 2. скопировать то, что было сделано до сих пор, и 3. пометить для сборки мусора память, которая использовалась ранее. .

gboffi 07.07.2018 15:21

Привет, вы думаете, чего я хочу достичь, можно сделать и с помощью операции конкатенации? Я имею в виду, как я продолжаю конкатенацию массива?

Ryan 07.07.2018 17:03

Другие вопросы по теме