7
votes

Conversion d'une liste de chaînes dans une matrice numpue de manière plus rapide

br code> est le nom d'une liste des chaînes qui va comme ceci: xxx pré>

Je suis intéressé par les deux premières colonnes, que je voudrais convertir à un tableau numpy. Jusqu'à présent, j'ai proposé la solution suivante: p> xxx pré>

Ceci entraîne un tableau 2-D: P>

array([[  0.,   0.],
       [ 14.,   0.],
       [ 19.,   0.],
       [ 22.,   0.],
...


0 commentaires

3 Réponses :


2
votes

Vous pouvez essayer de préprocéder (avec AWK pour un exemple) la liste des chaînes s'ils proviennent d'un fichier et utilisent numpy.fromtxt. Si vous ne pouvez rien faire de la façon dont vous obtenez cette liste, vous avez plusieurs possibilités:

  • abandonner. Vous allez exécuter cette fonction une fois par jour. Vous ne vous souciez pas de la vitesse et votre solution est suffisamment bonne
  • Écris un plugin io avec Cyron. Vous avez un grand gain potentiel car vous pourrez faire toutes les boucles de C et affecter directement les valeurs dans un grand (10 ^ 5, 2) Numpy Ndarray
  • Essayez une autre langue pour résoudre votre problème. Si vous utilisez des langues telles que C ou HASKell, vous pouvez utiliser CTTYPES pour appeler les fonctions compilées dans une DLL de Python

    modifier

    Peut-être que cette approche est légèrement plus rapide: xxx


1 commentaires

Aimé la pensée "hors de la boîte"!



1
votes

Changer xxx pré>

à p> xxx pré>

peut entraîner une légère vitesse. Puisque vous ne vous souciez que des deux premiers articles séparés dans chaque ligne, il n'est pas nécessaire de diviser la ligne entière. Le 2 code> dans i.split ('', 2) code> indique divisé code> pour simplement faire un maximum de 2 divisions. Par exemple, P>

In [11]: x='14 0.000000 -- (long term 0.000000)\n' 

In [12]: x.split()
Out[12]: ['14', '0.000000', '--', '(long', 'term', '0.000000)']

In [13]: x.split(' ',2)
Out[13]: ['14', '0.000000', '-- (long term 0.000000)\n']


1 commentaires

Merci pour l'explication du deuxième argument de Split !



4
votes

Ceci est considérablement plus rapide pour moi: xxx

modifications:

  • préallocate le tableau NUMPY (c'est grand). Vous savez déjà que vous voulez un tableau en 2 dimensions avec des dimensions particulières.
  • Seulement Split () pour les 2 premières colonnes, puisque vous ne voulez pas le reste.
  • N'utilisez pas de carte (): il est plus lent que les compréhensions de la liste. Je n'ai même pas utilisé les compréhensions de la liste, car vous savez que vous n'avez que 2 colonnes.
  • Attribuez directement dans la matrice Préallocate au lieu de générer de nouvelles matrices TEMP lorsque vous ithétiez.

2 commentaires

aa = numpy.array ([x.split ('' ', 2) [0: 2] pour x dans BR], dtype = "flotteur")


Bon à savoir sur énumérer : Je n'étais pas au courant de ça! Merci également à tsteabert à sa contribution. Les vitesses des deux solutions semblent assez similaires à moi.