2015-02-05 2 views
1

Я пытаюсь понять, почему этот код не сортирует массив ...Сортировочный массив (сортимент) нумерации

Произвольный вектор.

x = array([[3, 2, 4, 5, 7, 4, 3, 4, 3, 3, 1, 4, 6, 3, 2, 4, 3, 2]]) 
xCoo = sps.coo_matrix(x) 
perm = np.argsort(x) 
xCoo.col = perm[xCoo.col] 
print(xCoo.toarray()) # array([3, 2, 4, 5, 7, 4, 3, 4, 3, 3, 1, 4, 6, 3, 2, 4, 3, 2]) 

Я не уверен, что я неправильно понял. Каков правильный способ сделать это?

спасибо.

P.S. Я знаю, что я могу просто вызвать сортировку по массиву; однако я снова и снова применял эту перестановку.

+0

Что такое 'sps'? и какова цель 'coo_matrix'? Похоже, это должно быть что-то вроде: 'a = np.array ([...]); idx = np.argsort (a); sorted_a = a [idx] '... – mgilson

+0

' sps' is from: 'import scipy.sparse as sps'. 'coo_matrix' - это тип разреженной матрицы. –

+0

Действительно ли 'x' будет 1-й 2-й массив? Сколько строк в 'xCoo'? Цель состоит в том, чтобы сортировать столбцы многих разреженных матриц, все с одинаковыми 'perm'? – hpaulj

ответ

2

Первым осложнением является np.argsort(x) возвращает 2-й массив. Давайте делать вид на сплющенные x, чтобы получить более простой 1d perm:

In [1118]: perm=np.argsort(x,None) 

In [1119]: perm 
Out[1119]: 
array([10, 17, 1, 14, 13, 9, 16, 0, 6, 8, 5, 11, 2, 15, 7, 3, 12, 
     4], dtype=int32) 

это сортирует x, как мы ожидаем, не так ли?

In [1120]: x[:,perm] 
Out[1120]: array([[1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 6, 7]]) 

Применим его таким же образом к xCoo, за исключением того, что мы должны преобразовать его в формат lil. Формат coo не subscriptable:

In [1121]: xCoo.tolil()[:,perm].A 
Out[1121]: array([[1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 6, 7]], dtype=int32) 

Чтобы применить perm непосредственно к атрибутам xCoo, нам нужно сделать еще один вид:

xCoo.col = np.argsort(perm)[xCoo.col] # <==== 

Это работает для многорядных xCoo с нулями.

Вы также можете отсортировать данные:

xCoo.data = xCoo.data[perm[xCoo.col]] 

Они работают здесь, но им нужно больше испытывать.