Numpy: как заменить определенные индексы в массиве на индексы по возрастанию с шагом 1
У меня есть двумерный массив, в котором есть числа(индексы) типа [-1,-1,-1,-1,1,1,1,1,2,2,2,5,4,3,98,100,75,100], мне нужно чтоб индексы были в отличии с шагом 1 (-1 не нужно изменять) [-1,-1,-1,-1,1,1,1,1,2,2,2,3,4,5,6,7,8,8] 5->3, 3->5, 98->6, 100->7, 75->8. Думаю, что через цикл будет не очень тяжело сделать, но будет очень долго менять (массив 4844x10403). Вот кусочек кода, с которым можно сделать через цикл:
array2 = np.unique(array, return_counts=True)
i = 1
while i < array2[0].size:
array[array == array2[0][i]] = i
i = i + 1
Вот как стало и как было после np.unique(array, return_counts=True)

Ответы (1 шт):
Автор решения: Кирилл Малышев
→ Ссылка
import numpy as np
import pandas as pd
a = np.array([[ -1, -1, -1, -1, 1, 1],
[ 1, 1, 2, 2, 2, 5],
[ 4, 3, 98, 100, 75, 100]])
res = pd.Series.rank(pd.Series(np.ma.masked_equal(np.ravel(a), -1)), method='dense').to_numpy(dtype=np.int32, na_value=-1).reshape(a.shape)
print(res)
Печатается:
array([[-1, -1, -1, -1, 1, 1],
[ 1, 1, 2, 2, 2, 5],
[ 4, 3, 7, 8, 6, 8]])
Тут значения переводятся в зависимости от их величины по возрастанию с шагом 1. -1 игнорируются.