Есть ли способ инициализировать массив numpy формы и добавить к нему? Я объясню, что мне нужно, на примере списка. Если я хочу создать список объектов, сгенерированных в цикле, я могу:
a = []
for i in range(5):
a.append(i)
Я хочу сделать что-то подобное с массивом numpy. Я знаю о vstack, concatenate и т. Д. Однако, похоже, для этого требуются два массива numpy в качестве входных данных. Что мне нужно:
big_array # Initially empty. This is where I don't know what to specify
for i in range(5):
array i of shape = (2,4) created.
add to big_array
Он big_array
должен иметь форму (10,4)
. Как это сделать?
РЕДАКТИРОВАТЬ:
Хочу добавить следующее уточнение. Я знаю, что могу определить, big_array = numpy.zeros((10,4))
а затем заполнить его. Однако для этого необходимо заранее указать размер big_array. Я знаю размер в этом случае, но что, если я не знаю? Когда мы используем .append
функцию для расширения списка в Python, нам не нужно заранее знать его окончательный размер. Мне интересно, существует ли что-то подобное для создания большего массива из меньших массивов, начиная с пустого массива.
[i for i in range(5)]
. (Эквивалентно:list(range(5))
хотя это надуманный пример.)x = numpy.array()
мы бы сделали со списком вродеy = []
; но это не сработалоОтветы:
или
или
Однако менталитет, в котором мы создаем массив, добавляя элементы в список, мало используется в numpy, потому что он менее эффективен (типы данных numpy намного ближе к базовым массивам C). Вместо этого вы должны предварительно выделить массив до нужного вам размера, а затем заполнить строки. Но вы можете использовать,
numpy.append
если хотите.источник
append
numpy. Просто не выполнять предварительное выделение менее эффективно (в данном случае гораздо менее эффективно, посколькуappend
ing каждый раз копирует весь массив), поэтому это не стандартный метод.np.empty
массива заполнена значениями? А как насчет оставшихся «пустых» предметов?np.concatenate()
), вы можете инициализировать:np.empty((0, some_width))
. 0, поэтому ваш первый массив не будет мусором.Обычно я это делаю, создавая обычный список, затем добавляю в него свои данные и, наконец, преобразовываю список в массив numpy следующим образом:
конечно, ваш последний объект занимает в два раза больше места в памяти на этапе создания, но добавление в список python происходит очень быстро, как и создание с использованием np.array ().
источник
Введено в numpy 1.8:
Примеры:
источник
Аналог массива для питона
является:
источник
empty((0))
инициализирует массив numpy.numpy.fromiter()
это то, что вы ищете:Он также работает с выражениями генератора, например:
Если вы заранее знаете длину массива, вы можете указать ее с помощью необязательного аргумента count.
источник
Вы действительно хотите, насколько это возможно, избегать явных циклов при вычислении массивов, поскольку это снижает выигрыш в скорости от этой формы вычислений. Есть несколько способов инициализировать массив numpy. Если вы хотите, чтобы он был заполнен нулями, сделайте, как сказал katrielalex:
big_array = numpy.zeros((10,4))
РЕДАКТИРОВАТЬ: Какую последовательность вы делаете? Вы должны проверить различные функции numpy, которые создают массивы, например
numpy.linspace(start, stop, size)
(число с равным интервалом) илиnumpy.arange(start, stop, inc)
. По возможности, эти функции сделают массивы значительно быстрее, чем выполнение той же работы в явных циклах.источник
Чтобы инициализировать массив numpy с определенной матрицей:
вывод:
источник
Для вашего первого примера использования массива
Чтобы инициализировать big_array, используйте
Это предполагает, что вы хотите инициализировать нулями, что довольно типично, но есть много других способов инициализировать массив в numpy .
Изменить: если вы заранее не знаете размер big_array, обычно лучше сначала создать список Python с помощью append, а когда у вас есть все, что собрано в списке, преобразовать этот список в массив numpy, используя
numpy.array(mylist)
. Причина этого в том, что списки предназначены для очень эффективного и быстрого роста, тогда как numpy.concatenate будет очень неэффективным, поскольку массивы numpy не меняют размер легко. Но как только все будет собрано в список и вы узнаете окончательный размер массива, можно будет эффективно построить массив numpy.источник
Я бы предложил сначала определить форму. Затем переберите его, чтобы вставить значения.
источник
Когда бы вы ни оказались в следующей ситуации:
и вы хотите что-то подобное в numpy, в нескольких предыдущих ответах были указаны способы сделать это, но, как указал @katrielalex, эти методы неэффективны. Эффективный способ сделать это - создать длинный список, а затем изменить его так, как вы хотите, после того, как у вас будет длинный список. Например, предположим, что я читаю несколько строк из файла, и в каждой строке есть список чисел, и я хочу построить массив формы (количество прочитанных строк, длина вектора в каждой строке). Вот как я бы сделал это более эффективно:
источник
Я понимаю, что это немного поздно, но я не заметил никаких других ответов, в которых упоминается индексация в пустой массив:
Таким образом, вы заранее выделяете весь массив результатов
numpy.empty
и заполняете строки по мере продвижения, используя индексированное присвоение.Совершенно безопасно выполнить предварительное
empty
выделение, а неzeros
в приведенном вами примере, поскольку вы гарантируете, что весь массив будет заполнен генерируемыми фрагментами.источник
Может быть, что-то подобное подойдет вам ...
Что дает следующий результат
источник