2016-09-20 2 views
0

を推測することはできませんここでのpython SSCCEだ:Pythonの空csr_matrixはValueErrorををスロー:ゼロサイズのインデックスアレイからの寸法

import scipy.sparse 
data = [] 
row = [] 
col = [] 
csr = scipy.sparse.csr_matrix((data, (row, col))) #error happens here 
print(type(csr)) 
print(csr) 

私はエラーを取得するpython2.7でそれを実行している:

raise ValueError('cannot infer dimensions from zero sized index arrays') 
ValueError: cannot infer dimensions from zero sized index arrays 

csr = scipy.sparse.csr_matrix(([10,20,30], ([0,0,0],[0,1,2]))) 

またはこのような::私は彼らがこのような値養うとき、それは正しく動作

csr = scipy.sparse.csr_matrix(([10,20], ([0,0],[0,1]))) 
csr = scipy.sparse.csr_matrix(([10], ([0],[0]))) 

私はでドキュメントを読んで: http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csr_matrix.html

http://docs.scipy.org/doc/scipy/reference/sparse.html#usage-information

それは、私はそれでゼロのアイテムとCSR行列を作ることができない理由を説明していないようです。

このエラーは何が起こっているのですか?私は、scipy.sparse.csr.csr_matrix型は、インスタンス化時に少なくとも1つの値を持たなければならないと思いますか?それは愚かな制限のように思える。

答えて

1

Scipyスパース行列は、明確な形状を持っています。 (m、n)ここで、mは行数、nは列数です。例えば、csr_matrix(([1, 2], ([0, 3], [1, 4])))と書くと、csr_matrixは、行と列のインデックスの最大値からシェイプを推定します。しかし、csr_matrix(([], ([], [])))と書くと、この関数は行列の形状を知る方法がありません。(デフォルトでは、形状(0、0)の行列は作成されません)。それが明示的shapeを与えることです処理する

一つの方法:

In [241]: csr_matrix(([], ([], [])), shape=(3, 3)) 
Out[241]: 
<3x3 sparse matrix of type '<class 'numpy.float64'>' 
    with 0 stored elements in Compressed Sparse Row format> 
+1

本当に、あなたはおそらく代わりに、配列が空でない場合でも、scipyのダウンロードが推測させるの明示的な形状を与える必要があります。 – user2357112

+0

'csr = scipy.sparse.csr_matrix((0、0))'のように、空のcsr_matrixを作成することができます。しかし、これは空のリストからは推測されません。それは質問です。なぜ要素がほしいと思っているのではなく、何かが間違っていると推測する必要がありますか?その答えは、それがちょうどその方法であり、それに対処しているからです。 –

+0

関連するコードは 'coo_matrix .__ init__'にあります。 – hpaulj

0

あなたは空のスパース行列作ることができます - 空の密なものからまたは形状パラメータを与えることによって:

In [477]: from scipy import sparse 
In [478]: sparse.csr_matrix([]) 
Out[478]: 
<1x0 sparse matrix of type '<class 'numpy.float64'>' 
    with 0 stored elements in Compressed Sparse Row format> 
In [479]: sparse.csr_matrix(([],([],[])),shape=(0,0)) 
Out[479]: 
<0x0 sparse matrix of type '<class 'numpy.float64'>' 
    with 0 stored elements in Compressed Sparse Row format> 

shapeで大きな空のものを作成することもできます。

In [480]: sparse.csr_matrix(([],([],[])),shape=(1000,1000)) 
Out[480]: 
<1000x1000 sparse matrix of type '<class 'numpy.float64'>' 
    with 0 stored elements in Compressed Sparse Row format> 
In [481]: M=_ 
In [482]: M[34,334]=1000 
/usr/lib/python3/dist-packages/scipy/sparse/compressed.py:730: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient. 
    SparseEfficiencyWarning) 

しかし、値を挿入することや新しい行列を連結することの非効率性を考えると、なぜあなたはそのような生き物を作りたいと思うのでしょうか。

最初の引数はタプルであるときsparse.coo_matrixから関連するコードは:

  try: 
       obj, (row, col) = arg1 
      except (TypeError, ValueError): 
       raise TypeError('invalid input format') 

      if shape is None: 
       if len(row) == 0 or len(col) == 0: 
        raise ValueError('cannot infer dimensions from zero ' 
            'sized index arrays') 
       M = np.max(row) + 1 
       N = np.max(col) + 1 
       self.shape = (M, N) 
関連する問題