Заменить только точно совпадающую строку python ndarry

1

У меня есть ndarray со строковыми записями. У меня также есть второй массив, который содержит каждую строковую запись ndarray уникально. Поэтому я хочу заменить строки ndarray на позицию второго массива, где определены строки. Я попробовал это:

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))

И я получаю в результате

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')

Это означает, что записи "B1X" были заменены на первом этапе на "0X" из-за замены "B1" на "0".

Я не мог найти способ указать точно совпадающие замены строк. Моя цель состоит в том, чтобы получить на первом этапе цикла for этот ndarray (только заменяя каждый "B1" на "0" без замены других строк "XB1X"..)

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')
  • 0
    Примечание. Массив «node_sorted» не содержит «B7».
  • 2
    Возможный дубликат Заменить точную подстроку в Python
Показать ещё 1 комментарий
Теги:
numpy
scipy
replace

3 ответа

1

Ваш код с минимальными изменениями:

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)

Это использует панд и проверки на равенство.

  • 0
    Спасибо! Это решение!
  • 0
    Пожалуйста. Вы можете пометить это как решение, нажав на флажок слева.
0

Я думаю, что вы можете сделать:

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

\\bB1: соответствует B1 в начале слова.

Если вы хотите сохранить первый столбец, выполните:

[[x[0]] + [re.sub('\\bB1','0',y) for y in x[1:]] for x in extern_nodes]
  • 0
    Я получаю с вашим кодом тот же результат: / Первый столбец не должен быть заменен
  • 0
    Попробуйте r"\bB1\b" в качестве шаблона. Вам нужны границы с обеих сторон.
Показать ещё 1 комментарий
0

Пожалуйста, попробуйте код ниже. Вы можете легко включить его в свой цикл 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 сравнивает все элементы в массиве со значением (в данном случае 'A2') и присваивает им другое значение (0).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню