почему я получаю предупреждение о скудной разреженной колонке? - PullRequest
0 голосов
/ 11 мая 2018

Скудная документация csr_matrix говорит о том, что этот вид матрицы эффективен для нарезки строк.Используя этот код:

import numpy as np
from scipy import sparse

dok = sparse.dok_matrix((5,1))
dok[1,0] = 1

data = np.array([0,1,2,3,4])
row = np.array([0,1,2,3,4])
col = np.array([0,1,2,3,4])
csr = sparse.csr_matrix((data, (row, col)))
csr[:, 0] += dok

Я получаю это предупреждение:

SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.

Почему я получаю это предупреждение?

1 Ответ

0 голосов
/ 11 мая 2018

Это не относится к строке или столбцу. По сути, вы заставляете Сципи вставлять элементы в середину двух массивов, что, как говорится в предупреждении, стоит дорого.

Давайте посмотрим на внутреннее представление csr до и после модификации на месте, чтобы подтвердить это:

>>> csr.data
array([0, 1, 2, 3, 4], dtype=int64)
>>> csr.indices
array([0, 1, 2, 3, 4], dtype=int32)
>>> 
>>> csr[:, 0] += dok
/home/paul/lib/python3.6/site-packages/scipy/sparse/compressed.py:742: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
  SparseEfficiencyWarning)
>>> csr.data
array([0, 1, 1, 2, 3, 4], dtype=int64)
>>> csr.indices
array([0, 0, 1, 2, 3, 4], dtype=int32)

Немного предыстории: сжатые разреженные форматы строк и столбцов по существу хранят только ненулевые значения. Они делают это упакованным способом, используя векторы для хранения ненулевых значений и их координат в определенном порядке. Если операция добавляет новые ненулевые элементы, они, как правило, не могут быть добавлены, но должны быть вставлены, что мы и видим в примере и что делает его дорогим.

...