How to make 1d array multiplied by 2d array resulting in 3d array for python
Question: I am worrying that this might be a really stupid question. However I can't
find a solution. I want to do the following operation in python without using
a loop, because I am dealing with large size arrays. Is there any suggestion?

    
    
    import numpy as np
    a = np.array([1,2,3,..., N]) # arbitrary 1d array
    b = np.array([[1,2,3],[4,5,6],[7,8,9]]) # arbitrary 2d array
    c = np.zeros((N,3,3))
    c[0,:,:] = a[0]*b
    c[1,:,:] = a[1]*b
    c[2,:,:] = a[2]*b
    c[3,:,:] = ...
    ...
    ...
    c[N-1,:,:] = a[N-1]*b
    


Answer: To avoid Python-level loops, you could use `np.newaxis` to expand `a` (or
None, which is the same thing):

    
    
    >>> a = np.arange(1,5)
    >>> b = np.arange(1,10).reshape((3,3))
    >>> a[:,None,None]*b
    array([[[ 1,  2,  3],
            [ 4,  5,  6],
            [ 7,  8,  9]],
    
           [[ 2,  4,  6],
            [ 8, 10, 12],
            [14, 16, 18]],
    
           [[ 3,  6,  9],
            [12, 15, 18],
            [21, 24, 27]],
    
           [[ 4,  8, 12],
            [16, 20, 24],
            [28, 32, 36]]])
    

Or
[`np.einsum`](http://docs.scipy.org/doc/numpy/reference/generated/numpy.einsum.html),
which is overkill here, but is often handy and makes it very explicit what you
want to happen with the coordinates:

    
    
    >>> c2 = np.einsum('i,jk->ijk', a, b)
    >>> np.allclose(c2, a[:,None,None]*b)
    True
    

