# [SciPy-user] array vs matrix, converting code from matlab

Ed Schofield schofield at ftw.at
Fri Apr 21 05:17:34 CDT 2006

```David Cournapeau wrote:
> To be more specific, I am trying to convert a function which compute
> multivariate Gaussian densities. It should be able to handle scalar
> case, the case where the mean is a vector, and the case where va is a
> vector (diagonal covariance matrix) or square matrix (full covariance
> matrix).
>     So, in matlab, I simply do:
>
> function [n, d, K, varmode] = gaussd_args(data, mu, var)
>
> [n, d]  = size(data);
> [dm0, dm1] = size(mu);
> [dv0, dv1]= size(var);
>
> And I check that the dimensions are what I expect afterwards. Using
> arrays, I don't see a simple way to do that while passing scalar
> arguments to the functions. So either I should be using matrix type (and
> using asmatrix on the arguments), or I should never pass scalar to the
> function, and always pass arrays. But maybe I've used matlab too much,
> and there is a much simpler way to do that in scipy.
>     To sum it up, what is the convention in scipy when a function
> handles both scalar and arrays ? Is there an idiom to treat scalar and
> arrays of size 1 the same way, whatever the number of dimensions arrays
> may have ?
>

You could use rank-0 arrays instead of scalars.  For example, if your
function were to wrap the arguments up with 'asarray', they'd then have
the normal methods and attributes of arrays:

def foo(x, mu, va):
x = asarray(x)
mu = asarray(m)
va = asarray(va)
if mu.ndim == 0 and va.ndim == 0:
call scalar_implementation
return result
if mu.ndim == 1 and va.ndim == 1:
call scalar implementation on each element
if mu.ndim == 1 and va.ndim == 2:
call matrix implementation

-- Ed

```