J'ai besoin de créer un tableau NumPy de longueur n
, dont chaque élément est v
.
Y a-t-il quelque chose de mieux que:
a = empty(n)
for i in range(n):
a[i] = v
Je sais zeros
et ones
fonctionnerais pour v = 0, 1. Je pourrais utiliser v * ones(n)
, mais cela ne fonctionnera pas quand il serait v
est None
, etégalement beaucoup plus lent.
a = np.zeros(n)
dans la boucle est plus rapide quea.fill(0)
. Ceci est contraire à ce que j'attendais car je pensaisa=np.zeros(n)
qu'il faudrait allouer et initialiser une nouvelle mémoire. Si quelqu'un peut expliquer cela, je l'apprécierais.v * ones(n)
c'est toujours horrible, car il utilise la multiplication coûteuse. Remplacez-le*
par+
cependant etv + zeros(n)
s'avère étonnamment bon dans certains cas ( stackoverflow.com/questions/5891410/… ).var = np.empty(n)
puis de le remplir avec 'var [:] = v'. (btw,np.full()
c'est aussi rapide que ça)Réponses:
NumPy 1.8 introduit
np.full()
, qui est une méthode plus directe que celleempty()
suiviefill()
pour créer un tableau rempli d'une certaine valeur:C'est sans doute la façon de créer un tableau rempli de certaines valeurs, car il décrit explicitement ce qui est réalisé (et il peut en principe être très efficace car il effectue une tâche très spécifique).
la source
help(numpy.full)
dans un shell Python. Je suis également surpris qu'il ne figure pas dans la documentation Web.np.fill()
n'existe pas et devrait l'êtrearr.fill()
), avec une différence d'environ 10%. Si la différence était plus grande, je soulèverais un problème dans le traqueur de bogues NumPy. :) Je préfère un code plus explicite et plus clair, pour une si petite différence de temps d'exécution, donc j'y vaisnp.full()
tout le temps.Mise à jour pour Numpy 1.7.0: (Pointe du chapeau à @Rolf Bartstra.)
a=np.empty(n); a.fill(5)
est le plus rapide.Par ordre de vitesse décroissante:
la source
np.full()
serait utile d' ajouter un calendrier pour les plus récents et les plus directs . Sur ma machine, avec NumPy 1.8.1, elle est environ 15% plus lente que lafill()
version moins directe (ce qui est inattendu, car ellefull()
a le potentiel d'aller un peu plus vite).fill()
c'est la solution la plus rapide. La solution de multiplication est beaucoup plus lente.10000
au lieu de1e4
fait une différence notable, pour une raison quelconque (full()
est presque 50% plus lente, avec1e4
).full()
, il s'exécute considérablement plus lentement lorsque le type de données n'est pas explicitement un flottant. Sinon, c'est comparable (mais légèrement plus lent) avec les meilleures méthodes ici.full(100000, 5)
,full(100000, 5, dtype=float)
,full(100000, 5, dtype=int)
eta =np.empty(100000); a.fill(5)
tous prennent environ en même temps sur ma machine (sans mise en cache:%timeit -r1 -n1 …
) (NumPy 1.11.2).Je pense que
fill
c'est le moyen le plus rapide de le faire.Vous devez également toujours éviter d'itérer comme vous le faites dans votre exemple. Un simple
a[:] = v
accomplira ce que fait votre itération en utilisant la diffusion numpy .la source
fill
, j'ai vu que celarepeat
convenait encore mieux à mes besoins.a[:]=v
est en fait plus rapide que lafill
?fill
.Apparemment, non seulement les vitesses absolues mais aussi l' ordre de vitesse (tel que rapporté par user1579844) dépendent de la machine; voici ce que j'ai trouvé:
a=np.empty(1e4); a.fill(5)
est le plus rapide;Par ordre de vitesse décroissante:
Alors, essayez de découvrir et d'utiliser ce qui est le plus rapide sur votre plate-forme.
la source
j'ai eu
à l'esprit, mais apparemment, c'est plus lent que toutes les autres suggestions pour assez grand
n
.Voici une comparaison complète avec perfplot (un de mes projets favoris ).
Les deux
empty
alternatives sont toujours les plus rapides (avec NumPy 1.12.1).full
rattrape pour les grands tableaux.Code pour générer le tracé:
la source
Vous pouvez utiliser
numpy.tile
, par exemple:Bien qu'il
tile
soit destiné à «tuiler» un tableau (au lieu d'un scalaire, comme dans ce cas), il fera le travail, créant des tableaux pré-remplis de toutes tailles et dimensions.la source
sans engourdissement
la source
[v] * n
serait plus directement liée à la question du PO.