инициализация массива 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. Я знаю размер в этом случае, но что, если я не знаю? Когда мы используем

531   12  

12 ответов:

numpy.zeros

возвращает новый массив заданной формы и тип, заполненный нулями.

или

numpy.ones

возвращает новый массив заданной формы и типа, заполненные одними.

или

numpy.empty

возвращает новый массив заданной формы и тип, без инициализации вступления.


однако менталитет, в котором мы строим массив, добавляя элементы в список, не очень используется в 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:

numpy.full

возвращает новый массив заданной формы и типа, заполненный 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

    Ничего не найдено.