2017-03-06 124 views
0

如何获得稀疏复矩阵的元素绝对值?一般来说,是否可以使用用户定义的函数将矩阵映射到另一个矩阵?稀疏矩阵的元素绝对值

+0

你真的尝试过'np.absolute(spmat)'吗? –

+0

你问了两个问题,一个非常具体,一个非常一般。第二个答案可能取决于你想要的用户定义函数的普遍性。你可以举一些你想做什么的例子吗? –

+0

@WarrenWeckesser Paul Panzer为两者提供了答案。我的用户定义的函数将零映射到零。 –

回答

1

对我来说只是工作

import numpy as np 
from scipy import sparse 

a = sparse.identity(5).tocsr() * 1j 
a[2,4] = 1-1j 
b = np.absolute(a) 
b.A 
# array([[ 1.  , 0.  , 0.  , 0.  , 0.  ], 
#  [ 0.  , 1.  , 0.  , 0.  , 0.  ], 
#  [ 0.  , 0.  , 1.  , 0.  , 1.41421356], 
#  [ 0.  , 0.  , 0.  , 1.  , 0.  ], 
#  [ 0.  , 0.  , 0.  , 0.  , 1.  ]]) 

# general functions: use the data attribute to access nonzeros 

b.data = np.exp(b.data) 
b.A 
# array([[ 2.71828183, 0.  , 0.  , 0.  , 0.  ], 
#  [ 0.  , 2.71828183, 0.  , 0.  , 0.  ], 
#  [ 0.  , 0.  , 2.71828183, 0.  , 4.11325038], 
#  [ 0.  , 0.  , 0.  , 2.71828183, 0.  ], 
#  [ 0.  , 0.  , 0.  , 0.  , 2.71828183]]) 
+0

难道我们不是刚发现'稀疏'有一个所有'ufunc'版本保持0值不变吗?它返回自身的一个副本,但是'ufunc'应用于所有'.data'值。 – hpaulj

+0

@hpaulj是的,所以我们做到了。数据摆弄是为了不影响0的函数。或者你是否说我应该对所有其他'ufuncs'做更多的说教?你可能有一个点。说实话,我做了一个快速检查,没有找到“abs”或“绝对”成员,当然,完全忘了'__abs__'。如果你喜欢,你可以写一篇文章,涵盖我省略的东西。 –

+0

http://stackoverflow.com/questions/42408772/element-wise-exp-of-scipy-sparse-matrix - 关于发现稀疏的'expm1'方法的发现。 – hpaulj

1

在SciPy的稀疏矩阵对象实现的方法__abs__()以下。这意味着你可以使用Python的内置的abs()函数。它将发送呼叫到__abs__()方法。例如,

In [16]: from scipy.sparse import csr_matrix 

In [17]: a = csr_matrix([[1+1j, 0, 0, 0], [0, -2, 0, 0], [0, 0, 0, 0], [3-4j, 0, -5j, 0]]) 

In [18]: a.A 
Out[18]: 
array([[ 1.+1.j, 0.+0.j, 0.+0.j, 0.+0.j], 
     [ 0.+0.j, -2.+0.j, 0.+0.j, 0.+0.j], 
     [ 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j], 
     [ 3.-4.j, 0.+0.j, 0.-5.j, 0.+0.j]]) 

In [19]: b = abs(a) 

In [20]: b.A 
Out[20]: 
array([[ 1.41421356, 0.  , 0.  , 0.  ], 
     [ 0.  , 2.  , 0.  , 0.  ], 
     [ 0.  , 0.  , 0.  , 0.  ], 
     [ 5.  , 0.  , 5.  , 0.  ]])