[Scipy-tickets] [SciPy] #1859: Sparse matrix subtraction with another matrix seems to regard the other matrix as a scalar
SciPy Trac
scipy-tickets@scipy....
Fri Mar 1 20:30:13 CST 2013
#1859: Sparse matrix subtraction with another matrix seems to regard the other
matrix as a scalar
------------------------------------+---------------------------------------
Reporter: photon.engine | Owner: jakevdp
Type: defect | Status: new
Priority: normal | Milestone: Unscheduled
Component: scipy.sparse | Version: 0.10.1
Keywords: sparse scalar subtract |
------------------------------------+---------------------------------------
Comment(by warren.weckesser):
`numpy.dot` does not handle scipy's sparse matrices.
Since `matrix` is a sparse matrix, instead of writing
`numpy.dot(matrix, solution)`, you should use either `matrix * solution`
or `matrix.dot(solution)`.
If `matrix` had been, say, a CSR matrix, the code would have crashed
when `numpy.dot` was called. The DIA matrix doesn't crash, but it
doesn't
work.
Here's an example:
{{{
In [1]: from scipy.sparse import csr_matrix
In [2]: m = csr_matrix([[1,0,0],[2,3,0],[0,0,4]])
In [3]: m.toarray()
Out[3]:
array([[1, 0, 0],
[2, 3, 0],
[0, 0, 4]])
In [4]: b = array([10, 20, 30])
In [5]: np.dot(m, b)
---------------------------------------------------------------------------
ValueError Traceback (most recent call
last)
<ipython-input-5-0832d925df98> in <module>()
----> 1 np.dot(m, b)
ValueError: setting an array element with a sequence.
}}}
So using np.dot with a CSR matrix fails.
With a DIA matrix, however...
{{{
In [6]: d = m.todia()
In [7]: y = np.dot(d, b)
In [8]: y
Out[8]:
array([ <3x3 sparse matrix of type '<type 'numpy.int64'>'
with 5 stored elements (2 diagonals) in DIAgonal format>,
<3x3 sparse matrix of type '<type 'numpy.int64'>'
with 5 stored elements (2 diagonals) in DIAgonal format>,
<3x3 sparse matrix of type '<type 'numpy.int64'>'
with 5 stored elements (2 diagonals) in DIAgonal format>],
dtype=object)
In [9]: y[0].toarray()
Out[9]:
array([[10, 0, 0],
[20, 30, 0],
[ 0, 0, 40]])
In [10]: y[1].toarray()
Out[10]:
array([[20, 0, 0],
[40, 60, 0],
[ 0, 0, 80]])
}}}
`numpy.dot` returned a numpy array of the correct shape, but
it is of type 'object', and the contents are not what we expect.
--
Ticket URL: <http://projects.scipy.org/scipy/ticket/1859#comment:1>
SciPy <http://www.scipy.org>
SciPy is open-source software for mathematics, science, and engineering.
More information about the Scipy-tickets
mailing list