3

scipy sparse マトリックス タイプと通常の numpy マトリックス タイプの間には、いくつかの不一致があるようです。

import scipy.sparse as sp
A = sp.dia_matrix(tri(3,4))
vec = array([1,2,3,4])

print A * vec                        #array([ 1.,  3.,  6.])

print A * (mat(vec).T)               #matrix([[ 1.],
                                     #        [ 3.],
                                     #        [ 6.]])

print A.todense() * vec              #ValueError: matrices are not aligned

print A.todense() * (mat(vec).T)     #matrix([[ 1.],
                                     #        [ 3.],
                                     #        [ 6.]])

通常の行列ではできないのに、配列を列ベクトルとして解釈する必要があるのに、なぜスパース行列でうまくいくのでしょうか?

4

1 に答える 1

3

spmatrixクラス(scipy/sparse/base.pyで確認できます)に__mul__()は、質問に答えることができる「if」のセットがあります:

class spmatrix(object):
    ...
    def __mul__(self, other):
        ...
        M,N = self.shape
        if other.__class__ is np.ndarray:
            # Fast path for the most common case
            if other.shape == (N,):
                return self._mul_vector(other)
            elif other.shape == (N, 1):
                return self._mul_vector(other.ravel()).reshape(M, 1)
            elif other.ndim == 2  and other.shape[0] == N:
                return self._mul_multivector(other)

1D 配列の場合、次のコードを使用して、常にclass 内の_mul_vector()fromに移動します。compressed.py_cs_matrix

def _mul_vector(self, other):
    M,N = self.shape

    # output array
    result = np.zeros(M, dtype=upcast_char(self.dtype.char,
                                           other.dtype.char))

    # csr_matvec or csc_matvec
    fn = getattr(sparsetools,self.format + '_matvec')
    fn(M, N, self.indptr, self.indices, self.data, other, result)

    return result

疎行列の行数での出力を想定していることに注意してください。基本的に、入力1D配列を疎配列の列数に適合するものとして扱います(転置または非転置はありません)。しかし、それを使用した ndarrayndim==2では、そのような仮定を行うことができないため、試した場合:

vec = np.array([[1,2,3,4],
                [1,2,3,4]])

A * vec.T動作する唯一のオプションになります。

1D マトリックスの場合、スパース モジュールは、列数に適合することも想定していません。試すことができることを確認するには:

A * mat(vec)
#ValueError: dimension mismatch

そしてA * mat(vec).T、あなたの唯一の選択肢になります。

于 2013-06-01T18:39:06.997 に答える