U
    md                     @   sh   d dl Zd dlmZ d dlZd dddZejedddZej	d	d
dd Z
ej	d	d
dd ZdS )    N)sparseaxisc                C   sv   t | rt| |d\}}n6tj| |tjd}t| | j|tjd}||d  }|| j| | j| d  9 }||fS )Nr   )r   dtype      )r   issparsesparse_mean_variance_axisnpmeanfloat64multiplyshape)Xr   r   varZmean_sq r   T/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scanpy/preprocessing/_utils.py_get_mean_var   s    
r   )mtxr   c                 C   s   |dkst t| tjr$d}| j}n*t| tjrFd}| jddd }ntd||krtt| j| j	| j
f|tjf S t| j| j	f|tjf S dS )a^  
    This code and internal functions are based on sklearns
    `sparsefuncs.mean_variance_axis`.

    Modifications:
    * allow deciding on the output type, which can increase accuracy when calculating the mean and variance of 32bit floats.
    * This doesn't currently implement support for null values, but could.
    * Uses numba not cython
    )r   r   r   r   Nz7This function only works on sparse csr and csc matrices)AssertionError
isinstancer   Z
csr_matrixr   Z
csc_matrix
ValueErrorsparse_mean_var_major_axisdataindicesindptrr
   r   sparse_mean_var_minor_axis)r   r   Zax_minorr   r   r   r   r	      s$    
   r	   T)cachec                 C   s  |j d }tj||d}tj||d}tj|tjd}t|D ] }	||	 }
||
  | |	 7  < q>t|D ]}	||	  |  < qht|D ]@}	||	 }
| |	 ||
  }||
  || 7  < ||
  d7  < qt|D ]8}	||	  |||	  ||	 d  7  < ||	  |  < q||fS )z
    Computes mean and variance for a sparse matrix for the minor axis.

    Given arrays for a csr matrix, returns the means and variances for each
    column back.
    r   r   r   r   )r   r
   zeros
zeros_likeZint64range)r   r   	major_len	minor_lenr   Znon_zeromeans	variancescountsiZcol_inddiffr   r   r   r   -   s$    
$r   c                 C   s   t j||d}t j||d}t|D ]}|| }	||d  }
|
|	 }t|	|
D ]}||  | | 7  < qN||  |  < t|	|
D ](}| | ||  }||  || 7  < q||  || || d  7  < ||  |  < q$||fS )z
    Computes mean and variance for a sparse array for the major axis.

    Given arrays for a csr matrix, returns the means and variances for each
    row back.
    r   r   r   )r
   r    r!   r"   )r   r   r   r#   r$   r   r%   r&   r(   ZstartptrZendptrr'   jr)   r   r   r   r   P   s     r   )numpyr
   Zscipyr   Znumbar   Zspmatrixintr	   Znjitr   r   r   r   r   r   <module>   s   

"
