Why is the matrix @ product of two numpy (n,) vectors the dot product, rather than the outer product?
Function np.matmul was added when @ operator was introduced to Python.
The new function was designed to behave as similar to np.dot as reasonable.
So why np.dot(vector, vector) performs inner product?
Before @, the function np.dot was used to perform matrix algebra in numpy.
Actually, vectors in linear algebra are not 1D arrays but rather matrices with one of dimensions set to 1. In order to multiply 1D array by matrix, the former has to be somehow promoted to either row or column vector.
We have 3 cases here:

vector by matrix, 1D array is promoted to row vector (1xN) to make operation valid
matrix by vector, 1D array is promoted to column vector (Nx1)
vector by vector, left operand is promoted to row vector, right to column vector, as in previous both cases

As result in the last case we have a normal inner product between two vectors.
This policy is both logical and practical because inner products are used more often.
If I have x.shape = (n,) and y.shape = (n,), then x @ y returns their dot product, rather than their outer product. I was wondering if there was some underlying reason for this, or if its just for convenience.
Thanks.