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

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

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

<code>a= np.array()
for x in y:
     a.append(x)
</code>

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

 wim24 апр. 2013 г., 03:09
Что может быть более эффективным подходом - это выделить какой-то большой массив и удваивать его размер каждый раз, когда вы достигаете емкости.

Ответы на вопрос(5)

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

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)
 04 дек. 2013 г., 04:37
Я внес изменение здесь: список (_), и это работало отлично
 04 дек. 2013 г., 14:48
Чтобы быть ясным @javadba, вам не нужно этого делать - я уверен, что есть несколько Pythonistas, которые обидятся :)
 04 дек. 2013 г., 17:54
Это не вопрос стиля. без списка (_) он даже не работает наконец для случая, когда у меня есть, что у сам массив

a = np.array([])
for x in y:
    a = np.append(a, x)
 12 апр. 2012 г., 13:02
Это занимает линейное время на добавление.
 14 февр. 2013 г., 22:59
Этот подход копирует массив каждого добавления, который является O (сумма (диапазон (n))). На моем ноутбуке этот метод был в 42 раза медленнее, чем метод @ larsman: создание списка по методу larsmans в точности занимает у меня 1000 циклов, лучше всего 3: 1,53 мс на цикл. Следование этому методу занимает ровно 10 циклов, лучшее из 3: 64,8 мс на цикл.

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

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
Решение Вопроса

амортизированное O (1) время на добавление + O (n) для преобразования в массив, всего O (n).

    a = []
    for x in y:
        a.append(x)
    a = np.array(a)
 20 янв. 2018 г., 00:58
Или еще лучше:a = np.array([x for x in y]); или простоa = np.array(list(y))

Ваш ответ на вопрос