<div dir="ltr">I wrote a lightweight sparse ndarray library a few years ago: <a href="https://github.com/perimosocordiae/sparray">https://github.com/perimosocordiae/sparray</a><div><br></div><div>It uses Cython for some hot loops, otherwise it's fairly simple. It uses a flattened COO-like format that's pretty efficient for common ndarray use cases. I was planning to add other backends, but then I finished my degree and got a Real Job.</div><div><br></div><div>Around the same time, Evgeni was experimenting with <a href="https://github.com/ev-br/sparr">https://github.com/ev-br/sparr</a>, which uses a generalized DOK format for sparse ndarrays.</div><div><br></div><div>Both of these haven't seen development or use in a while, but if you're looking to put a sparse ndarray together they might be useful starting points.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Jun 3, 2021 at 4:03 PM Stefan van der Walt <<a href="mailto:stefanv@berkeley.edu">stefanv@berkeley.edu</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Evgeni,<br>
<br>
On Thu, Jun 3, 2021, at 12:34, Evgeni Burovski wrote:<br>
> You're thinking something like a lightweight `csr_array` which is<br>
> almost identical to the existing csr_matrix, but has  a np.array-like<br>
> multiplication?<br>
<br>
Exactly, and that also conforms with indexing expectations.<br>
<br>
> 1. What's the minimal subset of formats? Would CSR be enough, or some<br>
> others are needed from the start?<br>
<br>
I suspect we will have to cover most of them in order for this to be useful.  I just looked at NetworkX, for example, and they use CSR, LIL, and COO at least.<br>
<br>
> 2. Should this live in scipy.sparse or keep it in a separate repo in<br>
> the scipy org for a while?<br>
<br>
Most of it we can probably build separately, but it may require a few tweaks to the existing classes.  Those changes could simply be PRs (once there is rough consensus that we want to go this route).<br>
<br>
> 3.What about d != 2 ? E.g., does array[0, :] behave as a 1D numpy<br>
> array. What about array[:, :, None]. Does it broadcast? (This can<br>
> develop into quite a rabbit hole unless defined very clearly from the<br>
> start I suspect.)<br>
<br>
Indexing is probably the trickiest part to get right.  A first thought would be to limit any interactions that produce >2D, and to introduce 1d and 0d.  I'd have to double check, but it may be possible to do shape calculations, follow that by relying on existing operations to produce a result, and then adjust that result to conform to the expected shape.<br>
<br>
> 4. The interaction with scipy.sparse.linalg.<br>
<br>
We'd need some way to let `scipy.sparse.linalg` know what's going on.  One way would be to have `linalg` call `as_sparse_matrix` or `as_sparse_array` explicitly, depending on its needs.<br>
<br>
Stéfan<br>
_______________________________________________<br>
SciPy-Dev mailing list<br>
<a href="mailto:SciPy-Dev@python.org" target="_blank">SciPy-Dev@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/scipy-dev" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/scipy-dev</a><br>
</blockquote></div>