mirror of
https://github.com/chanzuckerberg/cellxgene.git
synced 2026-09-18 15:38:23 +08:00
* Specialize diffexp for tiledb This patch adds a new diffexp algorithm which is tuned for tiledb. This algorithm was written by Bruce and is adapted here to plug into the current framework. The anndata_adaptor still calls the original algotithm (which was move from diffexp.py to diffexp_generic.py). The cxg_adaptor now calls the new diffexp_tiledb version. Some code is shared between the two. This is part 1 of the diffexp for tiledb. Further tuning and global throttles are still needed. A script to run and time diffexp with various options is also added: test/run_diffexp.py.
38 lines
977 B
Python
38 lines
977 B
Python
import numpy as np
|
|
|
|
|
|
def pack_selector_from_mask(boolarray):
|
|
"""
|
|
pack all contiguous selectors into slices. Remember that
|
|
tiledb multi_index requires INCLUSIVE indices.
|
|
"""
|
|
|
|
if boolarray is None:
|
|
return slice(None)
|
|
|
|
assert type(boolarray) == np.ndarray
|
|
assert boolarray.dtype == bool
|
|
|
|
selector = np.nonzero(boolarray)[0]
|
|
return pack_selector_from_indices(selector)
|
|
|
|
|
|
def pack_selector_from_indices(selector):
|
|
|
|
if len(selector) == 0:
|
|
return slice(None)
|
|
|
|
result = []
|
|
current = slice(selector[0], selector[0])
|
|
for sel in selector[1:]:
|
|
if sel == current.stop + 1:
|
|
current = slice(current.start, sel)
|
|
else:
|
|
result.append(current if current.start != current.stop else current.start)
|
|
current = slice(sel, sel)
|
|
|
|
if len(result) == 0 or result[-1] != current:
|
|
result.append(current if current.start != current.stop else current.start)
|
|
|
|
return result
|