I have a few remarks, in random order: * The PEP is not just about the multiplication of matrices. The matrix-vector and vector-vector semantics are required in order to get nice expressions. This should probably be mentioned more prominently. * The complicated semantics for higher-dimensional arrays are effectively incompatible with the matrix-vector and vector-vector cases: for instance, writing the product of a list of matrices by a list of vectors requires something like "mats @ vecs[..., np.newaxis]". In other words, A @ B is AFAICT nearly equivalent to numpy.dot(A, B), therefore people who cannot use numpy.dot() today will not be able to use "@" either. * A big part of the problem with np.matrix is that it subclasses np.ndarray but has a completely different __mul__(). IMHO, the problems with it are a good argument for the importance of the Liskov substitution principle, but say rather little about the viability of a correctly implemented matrix type.