2016-07-07 2 views
1

У меня есть csr_matrix, скажем, я назвал:Каков правильный способ добавления элементов в csr_matrix?

import scipy.sparse as ss 
mat = ss.csr.csr_matrix((50, 100)) 

Теперь я хочу, чтобы изменить некоторые значения на этой матрице. Я называю:

mat[0,1]+=1 

И я получаю:

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

мне нужно только установить несколько значений (в масштабе матрицы наконец) сразу после создания матрицы. Позже я буду читать только столбцы или выполнять элементарные операции на всей матрице (например, .log1p())

Каким будет правильный способ? В настоящее время я могу просто игнорировать предупреждение, но может быть лучший способ, который не дает предупреждения.

+0

CSR и CSC являются предпочтительными форматами для быстрых вычислений линейной алгебры. Обычно вы создаете свою матрицу как COO, LIL или DOK, конвертируете ее в CSC или CSR только один раз, затем выполняете дорогостоящую математику. Это поможет лучше понять ваш случай использования: что вы хотите сделать с матрицей? Нужно ли добавлять новые данные между дорогостоящими операциями или добавлять дополнения в начале? – Jaime

+0

отредактирован, я надеюсь, что это более понятно. –

+0

Создайте [COO matrix] (http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.coo_matrix.html), добавьте к ней значения, затем преобразуйте их в CSC или CSR, если для ваших операций есть преимущество в скорости. Если все, что вам нужно, - это элементарные операции, COO, вероятно, будет в порядке. Если вы хотите извлечь столбцы, выберите CSC, если строки CSR. – Jaime

ответ

0

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

Общим способом создания разреженной матрицы является создание массивов стилей 3 coo со всеми ненулевыми значениями. Затем сделайте матрицу coo или csr напрямую (она принимает тот же стиль ввода).

Формат не имеет индексации, поэтому вы не можете делать M[i,j]=1 в любом случае. Но csr действительно реализует его. Я думаю, что предупреждение заключается в том, чтобы препятствовать нескольким изменениям (в цикле) не один или два.

Изменение разрешающей способности матрицы csr требует пересчета всего набора атрибутов (указатели данных и указателей). Вот почему это дорого. Я не делал таймингов, но это может быть почти так же дорого, как создание массива.

lil должно быть лучше для инкрементного назначения. Он хранит свои данные в списках списков и быстро вставляет значения в списки. Но преобразование csr в lil и обратно требует времени, поэтому я бы не сделал этого всего за несколько дополнений.

+0

Я не хочу менять внешний вид, я хочу делать все правильно. В настоящее время я не прошу изменить разреженность, но, похоже, все равно, и мне интересно, почему. –

+0

Некоторые формы добавления могут также вызвать это предупреждение. – hpaulj

+0

Я вижу это, но так ли плохо, как если бы я преобразовывал всю матрицу в не разреженный или это просто ложное предупреждение? Создание 3 векторов, как вы предлагаете, на самом деле не так дешево, поэтому я не хочу переключаться на него, если это не улучшит ситуацию. –