Ответ 1
Создайте список Python и преобразуйте его в массив Numpy. Это требует амортизации O (1) времени на добавление + O (n) для преобразования в массив, для всего O (n).
a = []
for x in y:
a.append(x)
a = np.array(a)
Я хочу, чтобы "строить" массив numpy "на лету", я не знаю размер этого массива заранее.
Например, я хочу сделать что-то вроде этого:
a= np.array()
for x in y:
a.append(x)
Что привело бы к содержанию всех элементов х, очевидно, это тривиальный ответ. Мне просто интересно, возможно ли это?
Создайте список Python и преобразуйте его в массив Numpy. Это требует амортизации O (1) времени на добавление + O (n) для преобразования в массив, для всего O (n).
a = []
for x in y:
a.append(x)
a = np.array(a)
Вы можете сделать это:
a = np.array([])
for x in y:
a = np.append(a, x)
Так как 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
Для потомков, я думаю, это быстрее:
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)
a = np.empty(0)
for x in y:
a = np.append(a, x)