-5
votes

Je veux prendre le XOR de tous les éléments de 1 liste avec une autre. Comment fait-on ça?

J'ai un tas de listes sous forme de dire [0,0,1,0,1 ...], et je veux prendre le XOR de 2 listes et donner la sortie comme une liste. Comme: [0, 0, 1] xor [0, 1, 0] -> [0, 1, 1] xxx

La taille de chacune de mes listes / vecteurs est d'environ 3500 éléments, de sorte que J'ai besoin de quelque chose pour gagner du temps, car ce morceau de code prend plus de 20 minutes à exécuter.

J'ai 3085 listes, chacun ayant besoin d'une opération XOR avec 4089 autres listes. < p> Comment puis-je faire cela sans itération à travers chaque liste explicitement?


6 commentaires

Qu'avez-vous essayé? Où est le code que vous avez utilisé?


"Alors j'ai besoin de quelque chose pour gagner du temps" - Non, vous ne le faites pas, du moins pas avant d'avoir fait quelque chose et que c'était trop lent. Avant de l'essayer, il est difficile de deviner même l'ordre de grandeur du temps qu'il faut pour faire cela (est-ce millisecondes, ou microsecondes, ou secondes, ou minutes?)


Ok, je marquais cela comme une duplicata comme une simple recherche de Xor Python m'a donné le lien ci-dessus. Vous pouvez facilement utiliser une boucle ou une compréhension de liste


Quelle que soit la mise en œuvre que vous sélectionnez, la mécanique sous-jacente de la mise en œuvre ira bien via les deux listes. Vous ne pouvez pas éviter cela. C'est un aspect fondamental de la programmation. De plus, 3500 éléments ne sont absolument rien. Même PHP, étant une mémoire inefficace en raison de tous les tableaux d'étant réellement des hashmaps, gère des tableaux de 3500 éléments de temps presque instantané. Il n'y a aucune raison pour que vous puissiez vous préoccuper de l'efficacité de l'exécution ici.


En fait, j'ai 2 séries de listes: premier ensemble ayant 3085 listes et deuxième ensemble ayant 4089 listes, et je dois prendre le XOR de chacune des 3085 listes avec chacune des 4089 listes. Il faut donc beaucoup de temps (plus de 20 minutes) pour exécuter le code et je veux l'optimiser d'une manière ou d'une autre


@Ankitbilla que d'utiliser Numpy. Il est conçu pour des choses comme ça.


3 Réponses :


0
votes

Assumer A et B a la même taille que vous pouvez utiliser l'opération xor (c.-à-d. ^ ) avec Indexation de liste simple: xxx

ou vous pouvez utiliser zip avec le xor : xxx

zip ira uniquement à la liste la plus courte (si elles n'ont pas la même taille). S'ils n'ont pas la même taille et que vous voulez aller à la liste plus longue, vous pouvez utiliser zip_longest : xxx


0 commentaires

0
votes

Utiliser mappe : xxx

ou zip : xxx

si Vous avez besoin de quelque chose de plus rapide, envisagez d'utiliser NUMPY à la place des listes Python pour contenir vos données.


3 commentaires

Comment votre code devra-t-il être modifié si j'avais des tableaux numpus au lieu de listes?


Si vous avez des tableaux numpus, vous pourrez simplement écrire quelque chose comme réponse = arr1 ^ arr2 ; De nombreux opérateurs binaires sont simplement définis par NUMPY pour effectuer des opérations ponctuelles lorsque les arguments sont tous les deux arguments.


Basé sur votre édition, cependant, vous n'auriez pas besoin d'opérations sur le point, vous souhaitez effectuer un XOR sur chaque élément du produit produit de vos deux listes, qui est intrinsèquement une opération O (N ^ 2) . NUMPY ne pourra pas accélérer de manière significative.



0
votes

Utilisation de numpy Vous devez avoir des gains de performance, la fonction dont vous avez besoin est bitwise_xor code>, comme: xxx pré>

une preuve de concept: p> xxx pré>

sortie: p> xxx pré>

edit h3>

Notez que si vos tableaux ont la même taille, vous pouvez simplement en faire un Opération et le Bitwise_XOR CODE> fonctionnera toujours, donc: p>

results = []
n = len(Course_Specific_Vocabulary_Dict['Binary Vector'])
for a in Employee_Specific_Vocabulary_Dict['Binary Vector']:
    # Get same size array w.r.t Course_Specific_Vocabulary_Dict["Binary Vector]
    repeated_a = np.repeat([a], n, axis=0)
    results.append(np.bitwise_xor(repeated_a, Course_Specific_Vocabulary_Dict['Binary Vector']))


2 commentaires

Salut. Lors de votre exécution de votre code de code, j'ai reçu l'erreur suivante: ValueError: les opérandes n'ont pas pu être diffusées avec des formes (3085.3761) (3085,)


Lequel des extraits de code que j'ai écrites? Aussi, quelle est la forme de vos tableaux? Je viens de les essayer et ils travaillent. N'oubliez pas que pour effectuer de telles opérations dont ils ont besoin d'avoir la même longueur.