2017-02-23 19 views
2

У меня очень большой редкий csc_matrixx. Я хочу сделать elementwise exp() на нем. В принципе, я хочу получить тот же результат, что и у меня с numpy.exp(x.toarray()). Но я не могу этого сделать (моя память не позволит мне преобразовать разреженную матрицу в массив). Есть ли выход? Заранее спасибо!Element wise exp() scipy разреженная матрица

+0

Если вы не можете держать вход в плотном формате, вы не сможете удерживать вывод; выход не будет разреженным, так как e^0 = 1. – user2357112

ответ

5

Если у вас нет памяти для хранения x.toarray(), у вас нет памяти для хранения вывода, о котором вы просите. Выход не будет скудным; на самом деле, если ваш вход не имеет отрицательные бесконечности в нем, выходе, вероятно, не будет иметь один 0.

Было бы, вероятно, лучше, чтобы вычислить ехр (х) -1, которая так просто, как

x.expm1() 
+0

Да, ты прав. Но как я могу это сделать только для ненулевых значений? –

+1

Что это? В разреженных матрицах содержатся все функции numpy, которые имеют нулевое значение в качестве членов? Есть функция, которую я бы не ожидал! –

+0

Да, 'scipy/sparse/data.py' имеет блок кода, который' # Добавляет numary unary ufuncs, для которого func (0) = 0 to _data_matrix.'. Ключ может получить доступ к атрибуту '.data' и создать новую матрицу с помощью метода' _with_data'. Я тоже этого не знал. – hpaulj

3

Если вы хотите что-то делать только на ненулевых значениях: атрибут data доступен для записи, по крайней мере, в некоторых представлениях, включая csr и csc. В некоторых представлениях допускаются повторяющиеся записи, поэтому убедитесь, что вы действуете на «нормализованной» форме.

+0

Да, это то, о чем я думал. Во всяком случае, я задержу руки! –

0

Для изменения ненулевых элементов, возможно, это будет работать для вас:

x = some big sparse matrix 
np.exp(x.data, out=x.data) # ask np.exp() to store results in existing x.data 

предположительно медленнее:

# above seems more efficient (no new memory alloc). 
x.data = np.exp(x.data) 

Я боролся с тем, как получить поэлементно log2() каждого ненулевого элемента массива. Я закончил тем, что сделал что-л. Вроде:

np.log2(x.data, out=x.data) 

Следующие два метода выглядят как именно то, что я искал. Моя матрица разрежена, но все равно множество ненулевых элементов.

Кредит @DSM here за идею прямого изменения x.data, я думаю, что это превосходное представление о разреженных матрицах.

Кредит @Mike Müller за идею использования «вне» как самого себя. В той же теме @kmario23 указывает на важное предостережение о продвижении .data в float (входные данные могут быть int или smth), поэтому он совместим с .exp() или любой другой функцией, я хотел бы сделать это, если бы я писал smth для общего использования.

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

Как правило, я бы не возился с частными атрибутами, но .data довольно четко проявляется в attributes documentation для различных разреженных матриц, на которые я смотрел.

Смежные вопросы