Как пометить записи матрицы как их индексы, но при этом сохранить их исходные числовые значения? - PullRequest
0 голосов
/ 11 октября 2019

У меня матрица_1 заполнена числовыми значениями, и я хотел бы преобразовать ее в матрицу_2 со значениями (отсортированной матрицы_1), а затем заменить эти отсортированные значения в матрице 2 исходными индексами из матрицы_1.

Я не хочу использовать какие-либо циклы, так как матрицы довольно большие.

for example : matrix_1=[[2,3,4,1],[6,5,9,7]]

I want to end up with matrix_2=[[(1,4),(1,1),(1,2),(1,3)],
                                 [(2,2),(2,1),(2,4),(2,3)]]

Я пытался использовать np.ndenumerate в исходной матрице, но он возвращает массив ([numpy. объект ndenumerate в 0x1a1a9fce90], dtype = object)

Я также попробовал np.argsort (), но, похоже, он не работает, возможно, потому что все мои записи являются числами с плавающей запятой ...

Ответы [ 3 ]

0 голосов
/ 11 октября 2019

Вы должны исходить из R или другого языка, который начинает индексирование на 1. В Python индексы начинаются с 0, поэтому вам нужно явно добавить + 1 к индексам, чтобы они начинались с 1.

Используйте argsort, а затем reshape

m1 = matrix_1.argsort(1) + 1
i = (np.repeat(np.arange(m1.shape[0]), m1.shape[1]) + 1).reshape(m1.shape)

np.concatenate([m1[:, None],i[:, None]], axis=1).swapaxes(2,1)

, который выводит

array([[[4, 1],
        [1, 1],
        [2, 1],
        [3, 1]],

       [[2, 2],
        [1, 2],
        [4, 2],
        [3, 2]]])
0 голосов
/ 11 октября 2019

argsort применено к сглаженному массиву:

In [110]: np.argsort(arr1.ravel())                                              
Out[110]: array([3, 0, 1, 2, 5, 4, 7, 6])

Преврати это в двумерные индексы:

In [111]: np.unravel_index(_,(2,4))                                             
Out[111]: (array([0, 0, 0, 0, 1, 1, 1, 1]), array([3, 0, 1, 2, 1, 0, 3, 2]))

Объедините массивы в один и измените форму:

In [112]: np.transpose(_)                                                       
Out[112]: 
array([[0, 3],
       [0, 0],
       [0, 1],
       [0, 2],
       [1, 1],
       [1, 0],
       [1, 3],
       [1, 2]])
In [113]: _+1           # tweak values to match yours
Out[113]: 
array([[1, 4],
       [1, 1],
       [1, 2],
       [1, 3],
       [2, 2],
       [2, 1],
       [2, 4],
       [2, 3]])
In [114]: _.reshape(2,4,2)                                                      
Out[114]: 
array([[[1, 4],
        [1, 1],
        [1, 2],
        [1, 3]],

       [[2, 2],
        [2, 1],
        [2, 4],
        [2, 3]]])
0 голосов
/ 11 октября 2019

использование np.argsort должно помочь:

matrix_1=np.array([[2,3,4,1],[6,5,9,7]])
matrix_1
array([[2, 3, 4, 1],
       [6, 5, 9, 7]])
x = np.argsort(matrix_1,axis=1)
array([[3, 0, 1, 2],
       [1, 0, 3, 2]], dtype=int64)

Матрица, состоящая из чисел с плавающей точкой, не должна создавать проблем.

Затем вы можете создать список следующим образом:

[[(i+1,v+1)   for v in enumerate(y)] for i, y in enumerate(x.tolist())]
[[(1, 4), (1, 1), (1, 2), (1, 3)], [(2, 2), (2, 1), (2, 4), (2, 3)]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...