web-dev-qa-db-fra.com

Initialise un tableau numpy de longueur inconnue

Je veux pouvoir «construire» un tableau numpy à la volée, je ne connais pas la taille de ce tableau à l'avance.

Par exemple, je veux faire quelque chose comme ça:

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

Ce qui résulterait en un contenant tous les éléments de x, évidemment ceci est une réponse triviale. Je suis juste curieux de savoir si c'est possible?

33
user1220022

Construisez une liste Python et convertissez-la en un tableau Numpy. Cela prend O(1) temps amorti par append + + O ( n ) pour la conversion en tableau, pour un total de O ( n ).

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

Tu peux le faire:

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

Comme y est un itérable, je ne vois vraiment pas pourquoi les appels à ajouter:

a = np.array(list(y))

va faire et c'est beaucoup plus rapide:

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
Mr_and_Mrs_D

Pour la postérité, je pense que cela est plus rapide:

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

Vous pourriez même pouvoir passer dans un générateur (c'est-à-dire [] -> ()), auquel cas la liste interne n'est jamais entièrement stockée en mémoire.


Répondre au commentaire ci-dessous:

>>> 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)
1
BenDundee
a = np.empty(0)
for x in y:
    a = np.append(a, x)
0
chiefenne