Hi,<div><br></div><div>As part of implementing a batch calculation of Jensen-Shannon divergence, I need to take a (sparse) 65536-element vector &quot;V&quot; and add it to every row of a (sparse) 500000x65536 matrix &quot;O&quot; of observations. Is there any way to do this that is both space and time efficient? The usual O+V tries to convert O to a dense matrix, which fails because O is too big to fit in memory (it would take up ~120 GB!).</div>

<div><br></div><div>I also can&#39;t do it slowly via iteration, because it looks like it&#39;s not possible to update a sparse matrix in place.</div><div><br></div><div>My current solution is to tile V into a new 500000x65536 matrix and then add:</div>

<div><br></div><div><div>import numpy as np</div><div>import sparse as sp</div><div>[...]</div><div>V = sp.csr_matrix(V)</div><div># Create the CSR matrix directly</div><div>Vindptr = np.arange(0, len(V.indices)*O.shape[0]+1, len(V.indices), dtype=np.int32)</div>

<div>Vindices = np.tile(V.indices, O.shape[0])</div><div>Vdata = np.tile(V.data, O.shape[0])</div><div>mV = sp.csr_matrix((Vdata, Vindices, Vindptr), shape=O.shape)</div><div>result = O+mV</div></div><div><br></div><div>
This is reasonably fast (though creating mV takes around 6 seconds on its own), but takes up a lot of memory to store even though there&#39;s a ton of duplicate data.</div>
<div><br></div><div>Is there any way to do this efficiently? It seems like there ought to be...</div><div><br></div><div>-Brendan</div>