On Sun, Aug 3, 2014 at 1:26 PM, Charles R Harris <[email protected]>
wrote:

> <snip>
>
> Oops, corrected version attached. I think we need generalized functions in
> linalg for mat x mat, mat x vec, and vec x mat, and versions that also work
> for object arrays. I've used einsum in the attached file for the products,
> but it doesn't work for object arrays.
>
> This work is mainly to have a prototype version for the matmul operator
> that  can be used to verify behavior and write some tests.
>
>
Another fix :(

Chuck
import numpy as np

class marray(np.ndarray):
    __array_priority__ = 1000

    def __new__(cls, *args, **kwargs):
        return np.array(*args, **kwargs).view(cls)

    def __matmul__(self, other):
        if not isinstance(other, marray):
            other = marray(other)

        # matrix multiplication by scalars not allowed
        if self.ndim == 0 or other.ndim == 0:
            raise TypeError("matrix multiplication with scalars not "
                            "allowed, use '*' instead'")

        if self.ndim == 1 and other.ndim == 1:
            res = np.einsum('i, i', self, other)
        elif self.ndim == 1:
            res = np.einsum('i, ...ij', self, other)
        elif other.ndim == 1:
            res = np.einsum('...i, i', self, other)
        else:
            res = np.einsum('...ij, ...jk', self, other)

        return marray(res)

    def __rmatmul__(self, other):
        return marray(other) @ self
_______________________________________________
NumPy-Discussion mailing list
[email protected]
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to