[Tutor] strange behavior of matrix**matrix

Steven D'Aprano steve at pearwood.info
Sun Jul 17 11:23:01 EDT 2016

On Sun, Jul 17, 2016 at 02:41:33PM +0200, A.Brozi wrote:
> Hello
> I'm puzzling over some strange behavior of raising a matrix to a matrix 
> power:
> If I create two matrices (containing integers):
> a = np.array([2])
> and
> b = np.array([-1])
> the operation a**b produces:
> array([0], dtype=int32)

What result did you expect? 2**-1 as an int32 cannot be 0.5, as that's a 

I'm not really sure about the rules that numpy uses for coercing from 
one type to another, but I'm not surprised by this result. I don't know 
if it is documented anywhere, but it seems like the sort of thing numpy 
would do. Here's another similar example:

py> np.array([0])**-1
__main__:1: RuntimeWarning: divide by zero encountered in power
__main__:1: RuntimeWarning: invalid value encountered in power

> The result of division b/a is correct:
> array([-0.5])

You only get that result in Python 3, or Python 2 with "from __future__ 
import division". Without it, / behaves the same as // (integer 
division), for example:

py> b//a
py> b/a

But once I run the future import, the behaviour changes:

py> from __future__ import division
py> b/a

> I wonder if it's a bug or a feature.
> And if it's a feature, then what is it useful for?

My guess is that the only reason for it is that it keeps the code 
simple, which allows numpy to be fast.


More information about the Tutor mailing list