0
votes

Cordes de rayures NUMPY Array via la diffusion

J'ai le code suivant xxx


Cela me donne la sortie souhaitée: xxx

comme vous pouvez voir 13 caractères à gauche sont partis. Est-il possible de diffuser cette opération?

J'ai essayé, xxx


mais cela ne donne pas la sortie correcte comme avant. xxx


3 commentaires

Peut-être une partie de docs.cipy.org/doc/numpy/reeference/Routines .chard.html peut aider mais je n'avais pas de chance dans 30 minutes d'essayer ...


Utilisez [i, j, ..,] lors de l'indexage numpy, non [] [] [] ..,


Regardez l'ensemble des fonctions de chaîne np.charne


4 Réponses :


1
votes

Utiliser la compréhension xxx

résultat: xxx


1 commentaires

Je ne suis pas sûr que cela diffuse depuis qu'il utilise pour les boucles.



1
votes

Vous pouvez convertir vos éléments de matrice en chiffres, les couper, puis convertir à la chaîne:

WIDTH = 5
MOD = 10 ** WIDTH
numpy.char.zfill((s.astype(numpy.int64) % MOD).astype('str'), WIDTH)
#array([['10005', '10006']], dtype='<U5')


5 commentaires

Je peux avoir des zéros n'importe où.


Obtenu overflowerror: python int trop grand pour convertir en C long


J'ai utilisé les chiffres de votre exemple. Vos numéros sont-ils plus gros? J'ai changé le type de données explicitement vers numpy.int64 .


Vous pouvez fournir l'exemple complet, je vais copier / coller le tester.


Je suppose que RJUST a un potentiel, mais je ne pouvais encore pas le faire fonctionner dans 30min. Ce sont des instructions vectorisées ...



1
votes

Une approche maladroite serait de convertir votre "chaîne de numéro" entier, effectuer un modulo à la longueur souhaitée puis convertir à une chaîne: xxx

qui donne le résultat souhaité.


6 commentaires

Cela fonctionne cependant, j'espère qu'il y a une approche encore meilleure.


Les cordes sont-elles toujours 18 caractères? Et sinon, est-il plus important de dépouiller les 13 premiers caractères ou de conserver les 5 derniers?


Il est plus important de conserver les derniers 5. Strings peut varier en taille. Ils sont 18 caractères en ce moment, mais mai ...


Si tel est le cas, ma solution devrait alors tenir. Malheureusement, Afaik, NUMPY ne gère pas la tranchée de chaîne. Donc, ce serait la meilleure solution purement numpue que je puisse voir.


L'autre réponse que j'ai trouvée vraiment des niveaux. Merci pour l'effort.


Espérons qu'il sera aussi gentil de retourner la faveur;)



2
votes
In [37]: sbig = np.resize(s, (1000,1000))                                       
In [38]: timeit np.mod(sbig.astype('uint64'),100000).astype('U')                
754 ms ± 9.33 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [39]: timeit np.frompyfunc(lambda s: s[-5:],1,1)(sbig)                       
245 ms ± 428 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)

3 commentaires

Excellent, il n'y a que environ 400 questions jusqu'à présent sur Numpy Broadcasting. Votre premier conseil consistait à regarder dans np.char ensemble de fonctions. Dis-vous que ce ne sont pas assez rapides, même s'ils sont vectorisés?


Aussi, est-il possible pour np.frompyfunc faire les choses sur lesquelles. Actuellement, il renvoie le résultat?


Avec votre objet dtype, fromyfunc transmet une chaîne à votre fonction. Une chaîne ne peut pas être modifiée en place. Votre fonction peut donc seulement renvoyer une nouvelle chaîne. Pour faire des modifications en place, vous devez itération et définir s [i, j] = s [i, j] [- 5:] . La plupart des opérations numpy créent un nouveau tableau, même s'il s'agit d'un tampon temporaire. Les vrais en place sont rares.