Since you only use `W` on this line, doing `W *= W` before this line can be an order of magnitude faster than calling `np.power(W, 2, W)`:

```
>>> x = np.zeros(10000000)
>>> t0=time(); np.power(x, 2, x); print(time()-t0)
0.134912967682
>>> t0=time(); x *= x; print(time()-t0)
0.0132510662079
```
This is likely because `power` uses an expansion, and/or because the `*=` can use SIMD instructions (not sure `power` can).