0

疎行列の 1 ノルムを計算しようとしているときに、1 つの問題があります。関数を使用していますscipy.sparse.linalg.onenormestが、演算子は正方行列にのみ作用するため、エラーが発生します。

コード例を次に示します。

from scipy import sparse

row = array([0,2,2,0,1,2])
col = array([0,0,1,2,2,2])
data = array([1,2,3,4,5,6])

A = sparse.csc_matrix( (data,(row,col)), shape=(5,3) )

onenormest(A)

これはエラーです:

Traceback (most recent call last):
  File "<ipython console>", line 1, in <module>
  File "C:\Python27\lib\site-packages\scipy\sparse\linalg\_onenormest.py", line 76, in onenormest
    raise ValueError('expected the operator to act like a square matrix')
ValueError: expected the operator to act like a square matrix

A を正方行列として定義すると、演算子onenormestは機能しますが、これは私が望むものではありません。

疎な非正方行列の 1 ノルムを計算する方法を知っている人はいますか?

4

2 に答える 2

1

代わりにnumpy.linalg.normが必要だと思います。

from numpy import linalg
from scipy import sparse


row = array([0,2,2,0,1,2])
col = array([0,0,1,2,2,2])
data = array([1,2,3,4,5,6])

A = sparse.csc_matrix( (data,(row,col)), shape=(5,3) )

print linalg.norm(A.todense(), ord=1) #15

.data疎行列オブジェクトは単なるデータであるため、A.data を呼び出すことはできません。代わりにベクトルとして表示されます。

疎行列が小さい場合は、これで問題ありません。それが大きい場合、明らかにこれは問題です。その場合、独自のルーチンを作成できます。

のみに関心がありL^1-norm、dense へのキャストが不可能な場合は、次のような方法で行うことができます。

def sparseL1Norm = lambda A: max([numpy.abs(A).getcol(i).sum() for i in range(A.shape[1])])
于 2014-11-06T14:15:47.633 に答える
1

これは、各列の L1 ノルムを見つけます。

from scipy import sparse
import numpy as np

row = np.array([0,2,2,0,1,2])
col = np.array([0,0,1,2,2,2])
data = np.array([1,2,3,-4,-5,-6]) # made negative to exercise abs
A = sparse.csc_matrix( (data,(row,col)), shape=(5,3) )
print(abs(A).sum(axis=0))

収量

[[ 3  3 15]]

次に、最大値を取得して、行列の L1 ノルムを見つけることができます。

print(abs(A).sum(axis=0).max())
# 15

abs(A)は疎行列です:

In [29]: abs(A)
Out[29]: 
<5x3 sparse matrix of type '<type 'numpy.int64'>'
    with 6 stored elements in Compressed Sparse Column format>

およびは疎行列のメソッドであるためsum、行列を高密度化せずに L1 ノルムを計算します。maxabs(A).sum(axis=0).max()

注: ほとんどの NumPy 関数 (np.abs など) は、スパース行列を操作するようには設計されていません。正しい結果を返しますがnp.abs(A)、間接的な経路で到達します。より直接的なルートは、abs(A)which 呼び出しを使用することA.__abs__()です。pvのおかげです。これを指摘します。

于 2014-11-06T14:22:47.640 に答える