Another 'alternative to adding a new operator at all': given the interpretation of a matrix multiplication as the operation of a matrix on a vector, it's a lot like a function operating on a vector (that just happens to be linear), so what about defining numpy.ndarray.__call__ as matrix multiplication?  That would allow A (B) instead of A.dot(B).  It doesn't shed any parentheses but is pretty compact.
   An advantage of this approach would be that it wouldn't require changing Python, only NumPy.  It can nearly be done in user-code, except that
```
>>> np.ndarray.__call__ = np.ndarray.dot
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'numpy.ndarray'
```