Подтвердить что ты не робот

Инициализировать массив 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

big_array должен иметь форму (10,4). Как это сделать?


EDIT:

Я хочу добавить следующее пояснение. Я знаю, что я могу определить big_array = numpy.zeros((10,4)), а затем заполнить его. Однако для этого требуется заранее указать размер big_array. Я знаю размер в этом случае, но что, если я этого не сделаю? Когда мы используем функцию .append для расширения списка в python, нам не нужно заранее знать его окончательный размер. Мне интересно, существует ли что-то подобное для создания большего массива из меньших массивов, начиная с пустого массива.

4b9b3361

Ответ 1

numpy.zeros

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

или

numpy.ones

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

или

numpy.empty

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


Однако менталитет, в котором мы строим массив, добавляя элементы в список, мало используется в numpy, потому что он менее эффективен (numpy datatypes намного ближе к лежащим в основе C массивам). Вместо этого вы должны предварительно распределить массив по размеру, который вам нужен, а затем заполнить строки. Вы можете использовать numpy.append, если это необходимо.

Ответ 2

Как обычно я это делаю, создавая обычный список, затем добавляю в него свои вещи и, наконец, преобразую список в массив 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.array() также.

Ответ 3

Появилось в версии 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]])

Ответ 4

Аналоговый массив для python

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)

Ответ 5

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".

Ответ 6

Вы должны избегать явных циклов как можно больше, когда делаете массивные вычисления, поскольку это уменьшает коэффициент усиления скорости от этой формы вычислений. Существует несколько способов инициализации массива numpy. Если вы хотите, чтобы он заполнился нулями, сделайте так, как сказал katrielalex:

big_array = numpy.zeros((10,4))

EDIT: Какую последовательность вы делаете? Вы должны проверить различные функции numpy, которые создают массивы, например numpy.linspace(start, stop, size) (равномерно распределенный номер) или numpy.arange(start, stop, inc). По возможности эти функции будут создавать массивы значительно быстрее, чем выполнение одной и той же работы в явных циклах

Ответ 7

Для вашего первого примера использования массива,

a = numpy.arange(5)

Чтобы инициализировать big_array, используйте

big_array = numpy.zeros((10,4))

Это предполагает, что вы хотите инициализировать с нулями, что довольно типично, но есть много других способов инициализации массива с помощью numpy.

Изменить: Если вы заранее не знаете размер big_array, обычно лучше сначала создать список Python, используя append, а когда у вас есть все, что собрано в списке, преобразовать этот список в массив с использованием numpy.array(mylist). Причиной этого является то, что списки должны расти очень эффективно и быстро, тогда как numpy.concatenate будет очень неэффективным, поскольку массивы numpy не могут легко изменить размер. Но как только все собрано в списке, и вы знаете окончательный размер массива, можно эффективно создать простой массив.

Ответ 8

Всякий раз, когда вы находитесь в следующей ситуации:

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

Ответ 9

Я понимаю, что это немного поздно, но я не заметил ни одного из других ответов, в которых упоминалось индексирование в пустой массив:

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 и заполняете строки по ходу, используя индексированное присваивание.

В примере, который вы указали, безопасно предустанавливать empty вместо zeros, поскольку вы гарантируете, что весь массив будет заполнен кусками, которые вы генерируете.

Ответ 10

Я бы предложил сначала определить форму. Затем переместите его, чтобы вставить значения.

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.]])

Ответ 11

Чтобы инициализировать пустой массив с определенной матрицей:

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]]

Ответ 12

Может быть, что-то вроде этого будет соответствовать вашим потребностям..

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.]]