# Summing multiple non-contiguous subsets of an array

**URL:** https://dask.discourse.group/t/summing-multiple-non-contiguous-subsets-of-an-array/374
**Category:** Dask Array
**Created:** [February 17, 2022, 11:18pm UTC](https://dask.discourse.group/t/summing-multiple-non-contiguous-subsets-of-an-array/374 "2022-02-17T23:18:27Z")
**Posts on this page:** 1
**Showing post:** 6

<div class="post-metadata">

### Author: ![ParticularMiner](https://yyz1.discourse-cdn.com/flex035/user_avatar/dask.discourse.group/particularminer/32/250_2.png) [@ParticularMiner](https://dask.discourse.group/u/ParticularMiner)
#### Post date: [February 22, 2022, 8:00pm UTC](https://dask.discourse.group/t/summing-multiple-non-contiguous-subsets-of-an-array/374/6 "2022-02-22T20:00:43Z")

</div>

Hi @mewmew_laser_kittens,

Here’s another `dask.array`-ish solution that ran (on my laptop) 10 times faster than the original one with list-comprehension. Feel free to ask for clarification if you need it.

```python
import numpy as np
import dask.array as da

def your_expression(arr, arr_idx, rng):
    res = np.concatenate(
        [arr[np.where(arr_idx == i)].sum(axis=0)[None, :] for i in rng],
        axis=0
    )
    # res.ndim = 2; insert new axis to get 3, as expected by blockwise()
    return res[np.newaxis, ...]

n = 256
darr = da.random.randint(n, size = (10000, 10000))
darr_idx = da.random.randint(n, size = 10000)
range_ = da.arange(n)
res = da.core.blockwise(
    *(your_expression, 'ikj'),
    *(darr, 'ij'),
    *(darr_idx, 'i'),
    *(range_, 'k'),
    adjust_chunks={'i': 1},
    dtype=np.int_,
    meta=np.array([[[]]])
)

identity = lambda x, axis, keepdims: x
meta = np.array([[]])
res = da.reduction(
    res, identity, np.sum, axis=0, dtype=np.int_, meta=meta
)
res.compute()

```

---

_[View the full topic](https://dask.discourse.group/t/summing-multiple-non-contiguous-subsets-of-an-array/374)._
