Skip to content

Backport PR #3353 on branch 1.11.x (Speed up categorical regressor with numba) #3654

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 28, 2025

Conversation

flying-sheep
Copy link
Member

Backports #3353

Copy link

codecov bot commented May 28, 2025

❌ 7 Tests Failed:

Tests completed Failed Passed Skipped
1988 7 1981 107
View the top 2 failed test(s) by shortest run time
tests/test_preprocessing.py::test_regress_out_int[uint64]
Stack Traces | 0.05s run time
dtype = dtype('float64')

    #x1B[0m#x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(#x1B[33m"#x1B[39;49;00m#x1B[33mdtype#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, [np.uint32, np.float64, np.uint64])#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mtest_regress_out_int#x1B[39;49;00m(dtype):#x1B[90m#x1B[39;49;00m
        adata = pbmc3k()[:#x1B[94m200#x1B[39;49;00m, :#x1B[94m200#x1B[39;49;00m].copy()#x1B[90m#x1B[39;49;00m
        adata.X = adata.X.astype(np.float64 #x1B[94mif#x1B[39;49;00m dtype != np.uint32 #x1B[94melse#x1B[39;49;00m np.float32)#x1B[90m#x1B[39;49;00m
        dtype = adata.X.dtype#x1B[90m#x1B[39;49;00m
        adata.obs[#x1B[33m"#x1B[39;49;00m#x1B[33mlabels#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m] = pd.Categorical(#x1B[90m#x1B[39;49;00m
            ([#x1B[33m"#x1B[39;49;00m#x1B[33mA#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m] * (adata.X.shape[#x1B[94m0#x1B[39;49;00m] - #x1B[94m100#x1B[39;49;00m)) + ([#x1B[33m"#x1B[39;49;00m#x1B[33mB#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m] * #x1B[94m100#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
        adata_other = adata.copy()#x1B[90m#x1B[39;49;00m
        adata_other.X = adata_other.X.astype(dtype)#x1B[90m#x1B[39;49;00m
        #x1B[90m# results using only one processor#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
>       sc.pp.regress_out(adata, keys=[#x1B[33m"#x1B[39;49;00m#x1B[33mlabels#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m])#x1B[90m#x1B[39;49;00m

#x1B[1m#x1B[31mtests/test_preprocessing.py#x1B[0m:416: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../site-packages/legacy_api_wrap/__init__.py#x1B[0m:82: in fn_compatible
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m fn(*args_all, **kw)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../scanpy/preprocessing/_simple.py#x1B[0m:806: in regress_out
    #x1B[0mres = Parallel(n_jobs=n_jobs)(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12....../site-packages/joblib/parallel.py#x1B[0m:1986: in __call__
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m output #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.return_generator #x1B[94melse#x1B[39;49;00m #x1B[96mlist#x1B[39;49;00m(output)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12....../site-packages/joblib/parallel.py#x1B[0m:1914: in _get_sequential_output
    #x1B[0mres = func(*args, **kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../scanpy/preprocessing/_simple.py#x1B[0m:828: in _regress_out_chunk
    #x1B[0m#x1B[94mimport#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mstatsmodels#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mapi#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mas#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96msm#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../site-packages/statsmodels/api.py#x1B[0m:76: in <module>
    #x1B[0m#x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m datasets, distributions, iolib, regression, robust, tools#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../statsmodels/distributions/__init__.py#x1B[0m:7: in <module>
    #x1B[0m#x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mdiscrete#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m (#x1B[90m#x1B[39;49;00m
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    #x1B[0m#x1B[94mimport#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mnumpy#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mas#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mnp#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
    #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mscipy#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mstats#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m rv_discrete, poisson, nbinom#x1B[90m#x1B[39;49;00m
    #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mscipy#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mspecial#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m gammaln#x1B[90m#x1B[39;49;00m
>   #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mscipy#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96m_lib#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96m_util#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m _lazywhere#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE   ImportError: cannot import name '_lazywhere' from 'scipy._lib._util' (/home/runner/..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../scipy/_lib/_util.py)#x1B[0m

#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../statsmodels/distributions/discrete.py#x1B[0m:5: ImportError
tests/test_preprocessing.py::test_regress_out_int[uint32]
Stack Traces | 0.07s run time
dtype = dtype('float32')

    #x1B[0m#x1B[37m@pytest#x1B[39;49;00m.mark.parametrize(#x1B[33m"#x1B[39;49;00m#x1B[33mdtype#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, [np.uint32, np.float64, np.uint64])#x1B[90m#x1B[39;49;00m
    #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mtest_regress_out_int#x1B[39;49;00m(dtype):#x1B[90m#x1B[39;49;00m
        adata = pbmc3k()[:#x1B[94m200#x1B[39;49;00m, :#x1B[94m200#x1B[39;49;00m].copy()#x1B[90m#x1B[39;49;00m
        adata.X = adata.X.astype(np.float64 #x1B[94mif#x1B[39;49;00m dtype != np.uint32 #x1B[94melse#x1B[39;49;00m np.float32)#x1B[90m#x1B[39;49;00m
        dtype = adata.X.dtype#x1B[90m#x1B[39;49;00m
        adata.obs[#x1B[33m"#x1B[39;49;00m#x1B[33mlabels#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m] = pd.Categorical(#x1B[90m#x1B[39;49;00m
            ([#x1B[33m"#x1B[39;49;00m#x1B[33mA#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m] * (adata.X.shape[#x1B[94m0#x1B[39;49;00m] - #x1B[94m100#x1B[39;49;00m)) + ([#x1B[33m"#x1B[39;49;00m#x1B[33mB#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m] * #x1B[94m100#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
        adata_other = adata.copy()#x1B[90m#x1B[39;49;00m
        adata_other.X = adata_other.X.astype(dtype)#x1B[90m#x1B[39;49;00m
        #x1B[90m# results using only one processor#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
>       sc.pp.regress_out(adata, keys=[#x1B[33m"#x1B[39;49;00m#x1B[33mlabels#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m])#x1B[90m#x1B[39;49;00m

#x1B[1m#x1B[31mtests/test_preprocessing.py#x1B[0m:416: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../site-packages/legacy_api_wrap/__init__.py#x1B[0m:82: in fn_compatible
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m fn(*args_all, **kw)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../scanpy/preprocessing/_simple.py#x1B[0m:806: in regress_out
    #x1B[0mres = Parallel(n_jobs=n_jobs)(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12....../site-packages/joblib/parallel.py#x1B[0m:1986: in __call__
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m output #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.return_generator #x1B[94melse#x1B[39;49;00m #x1B[96mlist#x1B[39;49;00m(output)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12....../site-packages/joblib/parallel.py#x1B[0m:1914: in _get_sequential_output
    #x1B[0mres = func(*args, **kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../scanpy/preprocessing/_simple.py#x1B[0m:828: in _regress_out_chunk
    #x1B[0m#x1B[94mimport#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mstatsmodels#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mapi#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mas#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96msm#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../site-packages/statsmodels/api.py#x1B[0m:76: in <module>
    #x1B[0m#x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m datasets, distributions, iolib, regression, robust, tools#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../statsmodels/distributions/__init__.py#x1B[0m:7: in <module>
    #x1B[0m#x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mdiscrete#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m (#x1B[90m#x1B[39;49;00m
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    #x1B[0m#x1B[94mimport#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mnumpy#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mas#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mnp#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
    #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mscipy#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mstats#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m rv_discrete, poisson, nbinom#x1B[90m#x1B[39;49;00m
    #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mscipy#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mspecial#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m gammaln#x1B[90m#x1B[39;49;00m
>   #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mscipy#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96m_lib#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96m_util#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m _lazywhere#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE   ImportError: cannot import name '_lazywhere' from 'scipy._lib._util' (/home/runner/..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../scipy/_lib/_util.py)#x1B[0m

#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../statsmodels/distributions/discrete.py#x1B[0m:5: ImportError
View the full list of 1 ❄️ flaky tests
tests/test_preprocessing.py::test_regress_out_constants

Flake rate in main: 26.67% (Passed 11 times, Failed 4 times)

Stack Traces | 0.009s run time
#x1B[0m#x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mtest_regress_out_constants#x1B[39;49;00m():#x1B[90m#x1B[39;49;00m
        adata = AnnData(np.hstack((np.full((#x1B[94m10#x1B[39;49;00m, #x1B[94m1#x1B[39;49;00m), #x1B[94m0.0#x1B[39;49;00m), np.full((#x1B[94m10#x1B[39;49;00m, #x1B[94m1#x1B[39;49;00m), #x1B[94m1.0#x1B[39;49;00m))))#x1B[90m#x1B[39;49;00m
        adata.obs[#x1B[33m"#x1B[39;49;00m#x1B[33mpercent_mito#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m] = np.random.rand(adata.X.shape[#x1B[94m0#x1B[39;49;00m])#x1B[90m#x1B[39;49;00m
        adata.obs[#x1B[33m"#x1B[39;49;00m#x1B[33mn_counts#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m] = adata.X.sum(axis=#x1B[94m1#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m
        adata_copy = adata.copy()#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
>       sc.pp.regress_out(adata, keys=[#x1B[33m"#x1B[39;49;00m#x1B[33mn_counts#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mpercent_mito#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m])#x1B[90m#x1B[39;49;00m

#x1B[1m#x1B[31mtests/test_preprocessing.py#x1B[0m:486: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../site-packages/legacy_api_wrap/__init__.py#x1B[0m:82: in fn_compatible
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m fn(*args_all, **kw)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../scanpy/preprocessing/_simple.py#x1B[0m:806: in regress_out
    #x1B[0mres = Parallel(n_jobs=n_jobs)(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12....../site-packages/joblib/parallel.py#x1B[0m:1986: in __call__
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m output #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.return_generator #x1B[94melse#x1B[39;49;00m #x1B[96mlist#x1B[39;49;00m(output)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12....../site-packages/joblib/parallel.py#x1B[0m:1914: in _get_sequential_output
    #x1B[0mres = func(*args, **kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../scanpy/preprocessing/_simple.py#x1B[0m:828: in _regress_out_chunk
    #x1B[0m#x1B[94mimport#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mstatsmodels#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mapi#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mas#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96msm#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../site-packages/statsmodels/api.py#x1B[0m:76: in <module>
    #x1B[0m#x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m datasets, distributions, iolib, regression, robust, tools#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../statsmodels/distributions/__init__.py#x1B[0m:7: in <module>
    #x1B[0m#x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mdiscrete#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m (#x1B[90m#x1B[39;49;00m
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    #x1B[0m#x1B[94mimport#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mnumpy#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mas#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mnp#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
    #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mscipy#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mstats#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m rv_discrete, poisson, nbinom#x1B[90m#x1B[39;49;00m
    #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mscipy#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mspecial#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m gammaln#x1B[90m#x1B[39;49;00m
>   #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mscipy#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96m_lib#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96m_util#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m _lazywhere#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE   ImportError: cannot import name '_lazywhere' from 'scipy._lib._util' (/home/runner/..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../scipy/_lib/_util.py)#x1B[0m

#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../statsmodels/distributions/discrete.py#x1B[0m:5: ImportError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@flying-sheep flying-sheep merged commit d27444b into 1.11.x May 28, 2025
7 of 9 checks passed
@flying-sheep flying-sheep deleted the auto-backport-of-pr-3353-on-1.11.x branch May 28, 2025 07:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants