инициализировать массив NumPy - PullRequest
105 голосов
/ 26 декабря 2010

Есть ли способ инициализировать массив фигуры и добавить к нему?Я объясню, что мне нужно, с примером списка.Если я хочу создать список объектов, сгенерированных в цикле, я могу сделать:

a = []
for i in range(5):
    a.append(i)

Я хочу сделать что-то подобное с массивом numpy.Я знаю о vstack, сцеплении и т. Д. Однако, кажется, что они требуют двух массивов в качестве входных данных.Что мне нужно, это:

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, нам не нужно заранее знать его окончательный размер.Мне интересно, существует ли нечто подобное для создания большего массива из меньших массивов, начиная с пустого массива.

Ответы [ 12 ]

131 голосов
/ 26 декабря 2010

numpy.zeros

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

или

numpy.ones

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

или

numpy.empty

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


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

37 голосов
/ 30 декабря 2010

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

13 голосов
/ 03 июля 2017

Представлено в 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]])
11 голосов
/ 17 июля 2014

Аналог массива для питона

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)
7 голосов
/ 06 мая 2013

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 голосов
/ 27 декабря 2010

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

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

РЕДАКТИРОВАТЬ: Какую последовательность вы делаете? Вы должны проверить различные функции numpy, которые создают массивы, такие как numpy.linspace(start, stop, size) (число с одинаковым интервалом) или numpy.arange(start, stop, inc). Там, где это возможно, эти функции будут создавать массивы значительно быстрее, чем выполнять ту же работу в явных циклах

5 голосов
/ 27 декабря 2010

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

a = numpy.arange(5)

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

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

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

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

3 голосов
/ 17 августа 2018
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]]
3 голосов
/ 14 сентября 2017

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

a = []
for i in range(5):
    a.append(i)

и вы хотите что-то похожее в numpy, в нескольких предыдущих ответах указывались способы сделать это, но, как указал @katrielalex, эти методы неэффективны,Эффективный способ сделать это состоит в том, чтобы создать длинный список и затем изменить его, как вы хотите, после того, как у вас есть длинный список.Например, предположим, что я читаю несколько строк из файла, и в каждой строке есть список чисел, и я хочу построить массив пустых фигур (количество прочитанных строк, длина вектора в каждой строке).Вот как я мог бы сделать это более эффективно:

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
2 голосов
/ 31 августа 2017

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

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.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...