2
votes

Remplacer uniquement le tableau python nd de chaîne de correspondance exacte

J'ai un ndarray avec des entrées de chaîne. J'ai également un deuxième tableau qui contient chaque entrée de chaîne du ndarray de manière unique. Je veux donc remplacer les chaînes du ndarray par la position du deuxième tableau, où la chaîne est définie. J'ai essayé ceci:

extern_nodes = sp.array([['B11', 'B6', '-1', '-1', '-1', '-1'],
   ['B9', 'B3', '-1', '-1', '-1', '-1'],
   ['B10', 'B5', '-1', '-1', '-1', '-1'],
   ['B8', 'B2', '-1', '-1', '-1', '-1'],
   ['B16', 'B6', '-1', '-1', '-1', '-1'],
   ['B15', 'B5', '-1', '-1', '-1', '-1'],
   ['B14', 'B3', '-1', '-1', '-1', '-1'],
   ['B12', '0', '-1', '-1', '-1', '-1'],
   ['B13', 'B2', '-1', '-1', '-1', '-1']], dtype='<U6')

Et j'obtiens comme résultat

Out:extern_nodes: array([['01', '5', '-1', '-1', '-1', '-1'],
       ['7', '2', '-1', '-1', '-1', '-1'],
       ['00', '4', '-1', '-1', '-1', '-1'],
       ['6', '1', '-1', '-1', '-1', '-1'],
       ['06', '5', '-1', '-1', '-1', '-1'],
       ['05', '4', '-1', '-1', '-1', '-1'],
       ['04', '2', '-1', '-1', '-1', '-1'],
       ['02', '0', '-1', '-1', '-1', '-1'],
       ['03', '1', '-1', '-1', '-1', '-1']], dtype='<U2')

Ce qui signifie que les entrées "B1X" ont été remplacées dans le premier pas à pas "0X" à cause du remplacement de "B1" par "0".

Je n'ai pas trouvé de moyen de spécifier exactement les remplacements de chaînes correspondants. Mon but est d'obtenir dans la première étape de la boucle for ce ndarray (en remplaçant uniquement chaque "B1" par "0" sans remplacer les autres chaînes "XB1X" ..)

import scipy as sp
extern_nodes = sp.array([['B11', 'B6', '-1', '-1', '-1', '-1'],
       ['B9', 'B3', '-1', '-1', '-1', '-1'],
       ['B10', 'B5', '-1', '-1', '-1', '-1'],
       ['B8', 'B2', '-1', '-1', '-1', '-1'],
       ['B16', 'B6', '-1', '-1', '-1', '-1'],
       ['B15', 'B5', '-1', '-1', '-1', '-1'],
       ['B14', 'B3', '-1', '-1', '-1', '-1'],
       ['B12', 'B1', '-1', '-1', '-1', '-1'],
       ['B13', 'B2', '-1', '-1', '-1', '-1']], dtype='<U6')
nodes_sorted = sp.array(['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B8', 'B9', 'B10', 'B11',
       'B12', 'B13', 'B14', 'B15', 'B16'], dtype='<U3')

for i in range(0, len(nodes_sorted)):
    extern_nodes = sp.char.replace(extern_nodes, nodes_sorted[i], str(i))


3 commentaires

Remarque: le tableau "nodes_sorted" ne contient pas "B7"


Double possible de Remplacer la sous-chaîne exacte en python


J'ai ajouté la balise numpy car sp.array est identique à np.array et vous n'utilisez aucune opération spécifique à scipy.


3 Réponses :


0
votes

Je pense que vous pouvez faire:

[[x[0]] + [re.sub('\\bB1','0',y) for y in x[1:]] for x in extern_nodes]

\\ bB1 : correspond à B1 au début d'un mot.

Si vous voulez pour conserver la première colonne, faites:

import re
extern_nodes = [[re.sub('\\bB1','0',y) for y in x] for x in extern_nodes]


2 commentaires

J'obtiens avec votre code le même résultat: / La première colonne ne doit pas être remplacée


Essayez r "\ bB1 \ b" comme modèle. Vous avez besoin des limites des deux côtés.



1
votes

Votre code avec des modifications minimes:

import pandas as pd
import scipy as sp
extern_nodes = sp.array([['B11', 'B6', '-1', '-1', '-1', '-1'],
       ['B9', 'B3', '-1', '-1', '-1', '-1'],
       ['B10', 'B5', '-1', '-1', '-1', '-1'],
       ['B8', 'B2', '-1', '-1', '-1', '-1'],
       ['B16', 'B6', '-1', '-1', '-1', '-1'],
       ['B15', 'B5', '-1', '-1', '-1', '-1'],
       ['B14', 'B3', '-1', '-1', '-1', '-1'],
       ['B12', 'B1', '-1', '-1', '-1', '-1'],
       ['B13', 'B2', '-1', '-1', '-1', '-1']], dtype='<U6')
nodes_sorted = sp.array(['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B8', 'B9', 'B10', 'B11',
       'B12', 'B13', 'B14', 'B15', 'B16'], dtype='<U3')
my_nodes = pd.DataFrame(extern_nodes)

for i in range(0, len(nodes_sorted)):
    my_nodes = my_nodes.applymap(lambda x: str(i) if x == nodes_sorted[i] else x)

Ceci utilise Pandas et vérifie l'égalité.


2 commentaires

Merci! Voilà la solution!


Vous êtes les bienvenus. Vous pouvez marquer cela comme la solution en cliquant sur la coche à gauche.



1
votes

Veuillez essayer le code ci-dessous. Vous pouvez l'inclure facilement dans votre boucle for .

arr = np.array(['A1','A2','A3','test'],dtype='<U6')
arr[arr=='A2'] = 0
arr

Out[1]: array(['A1', '0', 'A3', 'test'], dtype='<U6')

arr [arr == 'A2'] = 0 compare tous les éléments dans le tableau à la valeur ('A2' dans ce cas) et leur attribue une autre valeur (0).


0 commentaires