2015-02-10 1 views
1

Я делаю csr_matrix следующим образом:Что делает csr_matrix.sort_indices?

>>> A = sparse.csr_matrix([[0, 1, 0], 
          [1, 0, 1], 
          [0, 1, 0]]) 
>>> A[2,:] = np.array([-1, -2, -3]) 

>>> A.indptr 
Out[12]: array([0, 1, 3, 6], dtype=int32) 
>>> A.indices 
Out[13]: array([1, 0, 2, 0, 2, 1], dtype=int32) 
>>> A.data 
Out[14]: array([ 1, 1, 1, -1, -3, -2], dtype=int64) 

Теперь я хочу поменять местами два последних элемента в indices и data массивов, поэтому я стараюсь:

>>> A.sort_indices() 

Это не делает ничего к моей матрице. manual для этой функции указывает только, что он сортирует индексы.

  1. Что делает эта функция? В каком состоянии вы видите разницу?
  2. Как я могу сортировать массивы indices и data, так что для каждой строки индексы сортируются?

ответ

0

Как указано в документе, A.sort_indices() сортирует индексы на месте. Но есть кеш: if A.has_sorted_indices is True, it won't do anything (кеш был introduced at 0.7.0).

Для того, чтобы увидеть разницу, вам необходимо вручную установить A.has_sorted_indices в значение False.

>>> A.has_sorted_indices, A.indices 
(True, array([1, 0, 2, 0, 2, 1], dtype=int32)) 
>>> A.sort_indices() 
>>> A.has_sorted_indices, A.indices 
(True, array([1, 0, 2, 0, 2, 1], dtype=int32)) 
>>> A.has_sorted_indices = False 
>>> A.sort_indices() 
>>> A.has_sorted_indices, A.indices 
(True, array([1, 0, 2, 0, 1, 2], dtype=int32)) 

Обратите внимание, что, в отличие от того, что ОП указала, по состоянию на SciPy 0.19.0 работает A[2, :] = [-1, -2, -3] больше не производит вне порядка индекс (this should have been fixed in 0.14.0). С другой стороны, эта операция дает предупреждение:

SparseEfficiencyWarning: Изменение разреженности структуры csr_matrix дорого. lil_matrix более эффективен.

В любом случае, мы могли бы легко произвести индекс не по порядку другими способами, например. по матричному умножению:

>>> B = scipy.sparse.csr_matrix([[0, 1, 0], [1, 0, 1], [0, 1, 0]]) 
>>> C = B*B 
>>> C.has_sorted_indices, C.indices 
(0, array([2, 0, 1, 2, 0], dtype=int32)) 
>>> C.sort_indices() 
>>> C.has_sorted_indices, C.indices 
(True, array([0, 2, 1, 0, 2], dtype=int32)) 
Смежные вопросы