изменение значений массива - PullRequest
0 голосов
/ 10 декабря 2018

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

import numpy as np

data = np.array([[2, 6, 16, 39, 43],
                        [43, 6, 16, 39, 2]])


LUT={2:0,
    6:1,
    16:2,
    39:3,
    43:4} 

def changer(X):   
    res = np.copy(X)    
    for i, j in LUT.items():
        res[X==i] = j
    return res       

result = changer(data)
print (result)

[[0 1 2 3 4]
 [4 1 2 3 0]]

Результат правильный, как я и ожидал.Однако иногда мне лень делать LUT вручную.Итак, как я могу получить те же результаты программно?

edit

Я попытался создать словарь LUT следующим образом.

list = [2,6,16,39,43]

LUT = {}
for i in enumerate(list):
    LUT.update({list[i]: i})

But, 

D.update({list[i]: i})
TypeError: list indices must be integers, not tuple

Ответы [ 4 ]

0 голосов
/ 11 декабря 2018

Я думаю, что это действительно np.argsort:

Возвращает индексы для сортировки массива.

import numpy as np
data = np.array([[2, 6, 16, 39, 43],
                        [43, 6, 16, 39, 2]])
data.argsort(1).tolist()

Вывод:

[[0, 1, 2, 3, 4], [4, 1, 2, 3, 0]]

И чтобы вернуться назад, дав 1D массив, l и 2D массив индексов, iarr:

l = np.array([2, 6, 16, 39, 43])
iarr = np.array([[0, 1, 2, 3, 4], [4, 1, 2, 3, 0]])

Мы можем использовать вещание:

l[iarr]

Выход:

array([[ 2,  6, 16, 39, 43],
       [43,  6, 16, 39,  2]])
0 голосов
/ 11 декабря 2018

Используйте np.unique с флагом return_inverse:

data = np.array([[2, 6, 16, 39, 43],
                 [43, 6, 16, 39, 2]])

unq, ranked = np.unique(data, return_inverse=True)

unique без axis set flattens, поэтому нам нужно изменить форму

ranked = ranked.reshape(data.shape)
ranked
# array([[0, 1, 2, 3, 4],
#        [4, 1, 2, 3, 0]])
0 голосов
/ 11 декабря 2018

Если я понимаю, что вы хотите, np_lu должен автоматически генерироваться из ваших данных.

In [24]: np_lu=sorted(set(data.ravel()))
In [25]: np_lu
Out[25]: [2, 6, 16, 39, 43]

Создать массив индексов 2-> 0, 6-> 1, ... 43-> 4

In [29]: indx=np.array(np_lu)
In [33]: d=np.zeros(indx.max()+1)
In [34]: d[indx]=np.arange(len(indx))
In [35]: d
Out[35]:
array([ 0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,
    0.,  0.,  0.,  2.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
    0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
    3.,  0.,  0.,  0.,  4.])

In [36]: data
Out[36]:
array([[ 2,  6, 16, 39, 43],
       [43,  6, 16, 39,  2]])

Создать массив результатов, res.

In [37]: res=np.zeros_like(data)

Заполнить res данными в d, проиндексированными по данным.

In [41]: res=d[data]
In [42]: res
Out[42]:
array([[ 0.,  1.,  2.,  3.,  4.],
       [ 4.,  1.,  2.,  3.,  0.]])

Это будет работать толькодля данных типа int.Вероятно, в моем коде можно много чего привести.

0 голосов
/ 10 декабря 2018

Если я правильно понимаю ваши потребности, все, что вам нужно, это:

import numpy as np
lst = np.array([[i for i in range(len(data[0]))],[i for i in range(len(data[1])-1,-1,-1)]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...