7
votes

Numpy Convertir la représentation de chaîne de la matrice booléenne à la matrice booléenne

Y a-t-il une manière numérotée native de convertir une gamme de représentations de chaîne de booléens, par exemple: xxx

à une matrice booléenne réelle que je peux utiliser pour masquer / indexation? Je pourrais faire une boucle pour traverser et reconstruire la matrice, mais pour les grandes tableaux, c'est lent.


4 commentaires

Est-ce une matrice de chaîne numpue (si une telle chose existe) ou un tableau de cordes Python?


C'est un tableau de cordes numpy - bizarre, je sais.


@NewMu - Je pense que la solution à cela est d'éviter d'obtenir une gamme de représentations de chaînes en premier lieu. Comment êtes-vous venu par ce tableau? C'est peut-être là que nous devrions commencer à chercher celui-ci ...


Je dois m'occuper du code de quelqu'un d'autre.


3 Réponses :


0
votes

est-ce suffisant?

my_list = ['True', 'False', 'True', 'False']
np.array(x == 'True' for x in my_list)


2 commentaires

Cela ne fonctionnera pas comme écrit car NUMPY ne joue pas bien avec les expressions génératrices.


La boxe en tant que liste Comp fonctionne, mais il est 20 fois plus lent que la réponse de DSM pour les tableaux de plus de quelques milliers de valeurs.



8
votes

Vous devriez pouvoir faire une comparaison booléenne, IIUC, que le dtype est une chaîne ou objet : xxx

ou xxx


2 commentaires

Les merveilles de la radiodiffusion? En outre, il est rapide (20 fois plus rapide que l'autre réponse).


@NewMu et string interne, si je ne me trompe pas (au moins, tous les éléments de A qui sont 'true' ont la même valeur pour ID () , qui est également le cas pour tous les éléments 'faux' éléments [bien que curieusement, est ne semble pas fonctionner pour ces éléments. En fait, il ne veut pas Travaillez même lorsque vous testez une entrée contre elle-même. a [0] est un [0] renvoie false , même si ID (A [0]) == ID (A [0]) Retours VRAI ]) Je crois que la croire est la raison pour laquelle les contrôles d'égalité ici sont tellement plus rapides que numpy.char.startswith () Même si les fonctions de numpy.char sont censées effectuer des opérations de chaîne rapides sur des tableaux numpus.



2
votes

J'ai trouvé une méthode encore plus rapide que celle des DSM, en prenant l'inspiration d'Eric, bien que l'amélioration soit mieux vue avec des listes de valeurs plus petites; À très grandes valeurs, le coût de l'itération elle-même commence à l'emporter sur l'avantage d'effectuer les tests de vérité lors de la création de la matrice numpue plutôt qu'après. Test avec les deux est code> et == code> (pour les situations où les chaînes sont internées par rapport à quand elles pourraient ne pas être, car est code> ne fonctionnerait pas avec non -Interned Cordings. Comme 'vrai' code> va probablement être un littéral dans le script, il devrait être interné, cependant) a montré que pendant que ma version avec == code> était plus lente que avec est code>, il était encore beaucoup plus rapide que la version de DSM.

Configuration du test: p> xxx pré>

avec 1000 articles, les déclarations plus rapides prennent environ 66 % Le temps de DSM: p> xxx pré>

pour des matrices de chaîne plus petites (sur les centaines plutôt que des milliers), le temps écoulé est inférieur à 50% des DSM: P> XXX PRE>

Un peu plus de 25% de DSM est effectué avec 50 éléments par liste: P>

>>> timer(stateIs, 5)
[1.8826215278058953, 1.850232652068371, 1.8559381315990322]
>>> timer(stateEq, 5)
[1.9252821868467436, 1.894011299061276, 1.894306935199893]
>>> timer(stateDSM, 5)
[18.060974208809057, 17.916322392367874, 17.8379771602049]


4 commentaires

Avez-vous remarqué qu'ils sont tous vrai dans le résultat? :-P


@DSM Ma nouvelle réponse semble être une grande amélioration sur mon ancien.


@NewMu Mes deux sont encore légèrement plus rapides que les DSM, même avec des valeurs 5K, c'est que l'amélioration est beaucoup moins que pour les petites listes.


Ah ok! Juste difficile de battre la simplicité des DSM.