инициализация массива numpy
есть ли способ инициализировать массив 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
The big_array должна иметь форму (10,4). Как это сделать это?
EDIT:
Я хочу добавить следующее уточнение. Я знаю, что могу определить big_array = numpy.zeros((10,4)) а затем заполнить его. Однако для этого необходимо заранее указать размер big_array. Я знаю размер в этом случае, но что, если я не знаю? Когда мы используем
12 ответов:
возвращает новый массив заданной формы и тип, заполненный нулями.
или
возвращает новый массив заданной формы и типа, заполненные одними.
или
возвращает новый массив заданной формы и тип, без инициализации вступления.
однако менталитет, в котором мы строим массив, добавляя элементы в список, не очень используется в numpy, потому что он менее эффективен (типы данных numpy намного ближе к базовым массивам C). Вместо этого вы должны предварительно выделить массив до нужного размера, а затем заполнить строки. Вы можете использовать
numpy.appendЕсли вы должны, хотя.
обычно я делаю это, создавая обычный список, затем добавляю в него свои вещи и, наконец, преобразую список в массив numpy следующим образом:
import numpy as np big_array = [] # empty regular list for i in range(5): arr = i*np.ones((2,4)) # for instance big_array.append(arr) big_np_array = np.array(big_array) # transformed to a numpy arrayконечно, ваш конечный объект занимает в два раза больше места в памяти на этапе создания, но добавление в список python очень быстро и создание с использованием np.массив() также.
аналог массива для питона
a = [] for i in range(5): a.append(i)- это:
import numpy as np a = np.empty((0)) for i in range(5): a = np.append(a, i)
numpy.fromiter()это то, что вы ищете:big_array = numpy.fromiter(xrange(5), dtype="int")Он также работает с выражениями генератора, например:
big_array = numpy.fromiter( (i*(i+1)/2 for i in xrange(5)), dtype="int" )Если вы заранее знаете длину массива, вы можете указать его с помощью необязательного аргумента "count".
введено в numpy 1.8:
возвращает новый массив заданной формы и типа, заполненный fill_value.
примеры:
>>> import numpy as np >>> np.full((2, 2), np.inf) array([[ inf, inf], [ inf, inf]]) >>> np.full((2, 2), 10) array([[10, 10], [10, 10]])
для вашего первого примера использования массива,
a = numpy.arange(5)чтобы инициализировать big_array, используйте
big_array = numpy.zeros((10,4))Это предполагает, что вы хотите инициализировать нулями, что довольно типично, но есть много других способы инициализации массива в numpy.
Edit: Если вы заранее не знаете размер big_array, обычно лучше сначала построить список Python с помощью append, и когда у вас есть все, что собрано в списке, конвертировать этот список в массив numpy с помощью
numpy.array(mylist). Причина этого заключается в том, что списки должны расти очень эффективно и быстро, в то время как numpy.конкатенация была бы очень неэффективной, так как массивы numpy не меняют размер легко. Но как только все будет собрано в список, и вы знаете окончательный размер массива, массив numpy может быть эффективно построен.
вы хотите, чтобы избежать явных циклов как можно больше при выполнении вычислений массива, так как это уменьшает прирост скорости от этой формы вычислений. Существует несколько способов инициализации массива numpy. Если вы хотите, чтобы он был заполнен нулями, сделайте так, как сказал katrielalex:
big_array = numpy.zeros((10,4))EDIT: какую последовательность вы делаете? Вы должны проверить различные функции numpy, которые создают массивы, например
numpy.linspace(start, stop, size)(равноотстоящих), либоnumpy.arange(start, stop, inc). Где можно, эти функции сделают массивы существенно быстрее, чем выполнение той же работы в явных циклах
Я понимаю, что это немного поздно, но я не заметил ни одного из других ответов, упоминающих индексацию в пустой массив:
big_array = numpy.empty(10, 4) for i in range(5): array_i = numpy.random.random(2, 4) big_array[2 * i:2 * (i + 1), :] = array_iтаким образом, вы предварительно выделяете весь массив результатов с помощью
numpy.emptyи заполнить строки, как вы идете с помощью индексированного назначения.совершенно безопасно preallocate с
emptyвместоzerosв Примере, который вы дали, так как вы гарантируете, что весь массив будет заполнен кусками, которые вы генерируете.
Я бы предложил сначала определить форму. Затем повторите его, чтобы вставить значения.
big_array= np.zeros(shape = ( 6, 2 )) for it in range(6): big_array[it] = (it,it) # For example >>>big_array array([[ 0., 0.], [ 1., 1.], [ 2., 2.], [ 3., 3.], [ 4., 4.], [ 5., 5.]])
всякий раз, когда вы находитесь в следующей ситуации:
a = [] for i in range(5): a.append(i)и вы хотите что-то подобное в numpy, несколько предыдущих ответов указали способы сделать это, но, как указал @katrielalex, эти методы не эффективны. Эффективный способ сделать это-построить длинный список, а затем изменить его так, как вы хотите, после того как у вас есть длинный список. Например, предположим, что я читаю несколько строк из файла, и каждая строка имеет список чисел, и я хочу построить массив numpy форма (количество прочитанных строк, длина вектора в каждой строке). Вот как я бы сделал это более эффективно:
long_list = [] counter = 0 with open('filename', 'r') as f: for row in f: row_list = row.split() long_list.extend(row_list) counter++ # now we have a long list and we are ready to reshape result = np.array(long_list).reshape(counter, len(row_list)) # desired numpy array
может быть, что-то вроде этого будет соответствовать вашим потребностям..
import numpy as np N = 5 res = [] for i in range(N): res.append(np.cumsum(np.ones(shape=(2,4)))) res = np.array(res).reshape((10, 4)) print(res)который производит следующий вывод
[[ 1. 2. 3. 4.] [ 5. 6. 7. 8.] [ 1. 2. 3. 4.] [ 5. 6. 7. 8.] [ 1. 2. 3. 4.] [ 5. 6. 7. 8.] [ 1. 2. 3. 4.] [ 5. 6. 7. 8.] [ 1. 2. 3. 4.] [ 5. 6. 7. 8.]]
import numpy as np mat = np.array([[1, 1, 0, 0, 0], [0, 1, 0, 0, 1], [1, 0, 0, 1, 1], [0, 0, 0, 0, 0], [1, 0, 1, 0, 1]]) print mat.shape print matвыход:
(5, 5) [[1 1 0 0 0] [0 1 0 0 1] [1 0 0 1 1] [0 0 0 0 0] [1 0 1 0 1]]
Comments