
On Wed, Jun 3, 2015 at 2:25 PM, Stephan Hoyer <shoyer@gmail.com> wrote:
On Sat, May 30, 2015 at 3:23 PM, Charles R Harris < charlesr.harris@gmail.com> wrote:
The problem arises when multiplying a stack of matrices times a vector. PEP465 defines this as appending a '1' to the dimensions of the vector and doing the defined stacked matrix multiply, then removing the last dimension from the result. Note that in the middle step we have a stack of matrices and after removing the last dimension we will still have a stack of matrices. What we want is a stack of vectors, but we can't have those with our conventions. This makes the result somewhat unexpected. How should we resolve this?
I'm afraid I don't quite understand the issue. Maybe a more specific example of the shapes you have in mind would help? Here's my attempt.
Suppose we have two arrays: a with shape (i, j, k) b with shape (k,)
Following the logic you describe from PEP465, for a @ b we have shapes transform like so: (i, j, k,) @ (k, 1) -> (i, j, 1) -> (i, j)
This makes sense to me as a stack of vectors, as long as you are imagining the original stack of matrices as along the first dimension. Which I'll note is the default behavior for the new np.stack ( https://github.com/numpy/numpy/pull/5605).
Yes, you end up with a stack of vectors, but matmul will interpret them as a stack of matrices. I decided there is nothing to be done there and just documented it as a potential gotcha. The other possibility would be to prohibit or warn on stacked matrices and vectors for the `@` operator and that might limit what some folks want to do. Chuck