Python 稀疏矩阵的元素绝对值

Python 稀疏矩阵的元素绝对值,python,scipy,sparse-matrix,Python,Scipy,Sparse Matrix,如何获得稀疏复矩阵的元素绝对值?一般来说,是否可以使用用户定义的函数将一个矩阵映射到另一个矩阵?对我来说,以下方法很有效 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.

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

对我来说,以下方法很有效

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]])

对我来说,以下方法很有效

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]])

scipy中的稀疏矩阵对象实现了方法
\uu abs\uu()
。这意味着您可以使用Python内置的
abs()
函数。它将把调用分派给
\uuu abs\uuu()
方法。比如说,

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.        ]])

scipy中的稀疏矩阵对象实现了方法
\uu abs\uu()
。这意味着您可以使用Python内置的
abs()
函数。它将把调用分派给
\uuu abs\uuu()
方法。比如说,

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.        ]])

你真的试过np.absolute(spmat)?你问了两个问题,一个非常具体,一个非常笼统。第二个问题的答案可能取决于用户定义函数的通用性。你能再举一些你想做什么的例子吗?@WarrenWeckesser Paul Panzer提供了这两个问题的答案。我的用户定义函数会将零映射为零。您是否真的尝试过
np.absolute(spmat)
?您问了两个问题,一个非常具体,一个非常一般。第二个问题的答案可能取决于用户定义函数的通用性。你能再举一些你想做什么的例子吗?@WarrenWeckesser Paul Panzer提供了这两个问题的答案。我的用户定义函数会将零映射为零。我们不是刚刚发现
sparse
有一个版本的all
ufunc
,其中0个值保持不变吗?它返回自身的一个副本,但将
ufunc
应用于其所有
.data
值。@hpaulj是的,我们这样做了。
data
fiddling用于不保留0不变的函数。或者你是说我应该对所有其他的
ufunc
?你说得有道理。老实说,我做了一次快速检查,没有找到
abs
absolute
成员,当然,我完全忘记了
\uu abs
。如果你喜欢的话,你可以写一篇关于我遗漏的东西的帖子发现有一个稀疏的
expm1
方法时。@hpaulj或者你是说它是重复的?很抱歉,我今天有点慢。我们不是刚刚发现
sparse
有一个版本的all
ufunc
保留0个值不变吗?它返回自身的一个副本,但将
ufunc
应用于其所有
.data
值。@hpaulj是的,我们这样做了。
data
fiddling用于不保留0不变的函数。或者你是说我应该对所有其他的
ufunc
?你说得有道理。老实说,我做了一次快速检查,没有找到
abs
absolute
成员,当然,我完全忘记了
\uu abs
。如果你喜欢的话,你可以写一篇关于我遗漏的东西的帖子发现有一个稀疏的
expm1
方法时。@hpaulj或者你是说它是重复的?对不起,我今天有点慢。