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

Инициализировать массив numpy неизвестной длины

Я хочу, чтобы "строить" массив numpy "на лету", я не знаю размер этого массива заранее.

Например, я хочу сделать что-то вроде этого:

a= np.array()
for x in y:
     a.append(x)

Что привело бы к содержанию всех элементов х, очевидно, это тривиальный ответ. Мне просто интересно, возможно ли это?

4b9b3361

Ответ 1

Создайте список Python и преобразуйте его в массив Numpy. Это требует амортизации O (1) времени на добавление + O (n) для преобразования в массив, для всего O (n).

    a = []
    for x in y:
        a.append(x)
    a = np.array(a)

Ответ 2

Вы можете сделать это:

a = np.array([])
for x in y:
    a = np.append(a, x)

Ответ 3

Так как y является итерабельным, я действительно не понимаю, почему призывы добавить:

a = np.array(list(y))

сделает это гораздо быстрее:

import timeit

print timeit.timeit('list(s)', 's=set(x for x in xrange(1000))')
# 23.952975494633154

print timeit.timeit("""li=[]
for x in s: li.append(x)""", 's=set(x for x in xrange(1000))')
# 189.3826994248866

Ответ 4

Для потомков, я думаю, это быстрее:

a = np.array([np.array(list()) for _ in y])

Возможно, вы даже сможете пройти в генераторе (т.е. [] → ()), и в этом случае внутренний список никогда не будет полностью сохранен в памяти.


Отвечая на комментарий ниже:

>>> import numpy as np
>>> y = range(10)
>>> a = np.array([np.array(list) for _ in y])
>>> a
array([array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object)], dtype=object)

Ответ 5

a = np.empty(0)
for x in y:
    a = np.append(a, x)