"""Compute the outer product of two vectors."""
from __future__ import annotations
from typing import Optional
import numpy
import numpoly
from ..baseclass import ndpoly, PolyLike
from ..dispatch import implements
[docs]@implements(numpy.outer)
def outer(
a: PolyLike,
b: PolyLike,
out: Optional[ndpoly] = None,
) -> ndpoly:
"""
Compute the outer product of two vectors.
Given two vectors, ``a = [a0, a1, ..., aM]`` and
``b = [b0, b1, ..., bN]``, the outer product is::
[[a0*b0 a0*b1 ... a0*bN ]
[a1*b0 .
[ ... .
[aM*b0 aM*bN ]]
Args:
a:
First input vector. Input is flattened if not already
1-dimensional.
b:
Second input vector. Input is flattened if not already
1-dimensional.
out:
A location where the result is stored.
Return:
``out[i, j] = a[i] * b[j]``
Example:
>>> poly = numpoly.variable(3)
>>> const = numpy.arange(5)
>>> numpoly.outer(poly, const)
polynomial([[0, q0, 2*q0, 3*q0, 4*q0],
[0, q1, 2*q1, 3*q1, 4*q1],
[0, q2, 2*q2, 3*q2, 4*q2]])
"""
a, b = numpoly.align_exponents(a, b)
a = a.ravel()[:, numpy.newaxis]
b = b.ravel()[numpy.newaxis, :]
return numpoly.multiply(a, b, out=out)