Re: [Numpy-discussion] Proposal: Chaining np.dot with mdot helper function

2014-02-24 Thread Stefan Otte
Hey guys,

I just pushed an updated version to github:
https://github.com/sotte/numpy_mdot

Here is an ipython notebook with some experiments:
http://nbviewer.ipython.org/urls/raw2.github.com/sotte/numpy_mdot/master/2014-02_numpy_mdot.ipynb

- I added (almost numpy compliant) documentation.
- I use a function for len(args) == 3 to improve the speed.
- Some general cleanup.

Before I create a pull request I have a few questions:
- Should there be an optimize argument or should we always optimize
the parentheses? There is an overhead, but maybe we could neglect it?
I think we should keep the flag, but set it to True by default.
- I currently use a recursive algorithm to do the multiplication. Any
objections?
- In which file should `mdot` live?
- I wrote a function `print_optimal_chain_order(D, A, B, C,
names=list(DABC))` which determines the optimal parentheses and
print out a numpy expression. It's kinda handy but do we actually need
it?


Beste Grüße,
 Stefan



On Thu, Feb 20, 2014 at 8:39 PM, Nathaniel Smith n...@pobox.com wrote:
 On Thu, Feb 20, 2014 at 1:35 PM, Stefan Otte stefan.o...@gmail.com wrote:
 Hey guys,

 I quickly hacked together a prototype of the optimization step:
 https://github.com/sotte/numpy_mdot

 I think there is still room for improvements so feedback is welcome :)
 I'll probably have some time to code on the weekend.

 @Nathaniel, I'm still not sure about integrating it in dot. Don't a
 lot of people use the optional out parameter of dot?

 The email you're replying to below about deprecating stuff in 'dot'
 was in reply to Eric's email about using dot on arrays with shape (k,
 n, n), so those comments are unrelated to the mdot stuff.

 I wouldn't mind seeing out= arguments become kw-only in general, but
 even if we decided to do that it would take a long deprecation period,
 so yeah, let's give up on 'dot(A, B, C, D)' as syntax for mdot.

 However, the suggestion of supporting np.dot([A, B, C, D]) still seems
 like it might be a good idea...? I have mixed feelings about it -- one
 less item cluttering up the namespace, but it is weird and magical to
 have two totally different calling conventions for the same function.

 -n

 On Thu, Feb 20, 2014 at 4:02 PM, Nathaniel Smith n...@pobox.com wrote:
 If you send a patch that deprecates dot's current behaviour for ndim2,
 we'll probably merge it. (We'd like it to function like you suggest, for
 consistency with other gufuncs. But to get there we have to deprecate the
 current behaviour first.)

 While I'm wishing for things I'll also mention that it would be really neat
 if binary gufuncs would have a .outer method like regular ufuncs do, so
 anyone currently using ndim2 dot could just switch to that. But that's a
 lot more work than just deprecating something :-).

 -n

 On 20 Feb 2014 09:27, Eric Moore e...@redtetrahedron.org wrote:



 On Thursday, February 20, 2014, Eelco Hoogendoorn
 hoogendoorn.ee...@gmail.com wrote:

 If the standard semantics are not affected, and the most common
 two-argument scenario does not take more than a single if-statement
 overhead, I don't see why it couldn't be a replacement for the existing
 np.dot; but others mileage may vary.


 On Thu, Feb 20, 2014 at 11:34 AM, Stefan Otte stefan.o...@gmail.com
 wrote:

 Hey,

 so I propose the following.  I'll implement a new function `mdot`.
 Incorporating the changes in `dot` are unlikely. Later, one can still
 include
 the features in `dot` if desired.

 `mdot` will have a default parameter `optimize`.  If `optimize==True`
 the
 reordering of the multiplication is done.  Otherwise it simply chains
 the
 multiplications.

 I'll test and benchmark my implementation and create a pull request.

 Cheers,
  Stefan
 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion


 Another consideration here is that we need a better way to work with
 stacked matrices such as np.linalg handles now.  Ie I want to compute the
 matrix product of two (k, n, n) arrays producing a (k,n,n) result.  Near as
 I can tell there isn't a way to do this right now that doesn't involve an
 explicit loop. Since dot will return a (k, n, k, n) result. Yes this output
 contains what I want but it also computes a lot of things that I don't want
 too.

 It would also be nice to be able to do a matrix product reduction, (k, n,
 n) - (n, n) in a single line too.

 Eric

 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion


 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion

 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion



 --
 Nathaniel J. Smith
 

Re: [Numpy-discussion] Proposal: Chaining np.dot with mdot helper function

2014-02-20 Thread Stefan Otte
Hey,

so I propose the following.  I'll implement a new function `mdot`.
Incorporating the changes in `dot` are unlikely. Later, one can still include
the features in `dot` if desired.

`mdot` will have a default parameter `optimize`.  If `optimize==True` the
reordering of the multiplication is done.  Otherwise it simply chains the
multiplications.

I'll test and benchmark my implementation and create a pull request.

Cheers,
 Stefan
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Proposal: Chaining np.dot with mdot helper function

2014-02-20 Thread Eelco Hoogendoorn
If the standard semantics are not affected, and the most common
two-argument scenario does not take more than a single if-statement
overhead, I don't see why it couldn't be a replacement for the existing
np.dot; but others mileage may vary.


On Thu, Feb 20, 2014 at 11:34 AM, Stefan Otte stefan.o...@gmail.com wrote:

 Hey,

 so I propose the following.  I'll implement a new function `mdot`.
 Incorporating the changes in `dot` are unlikely. Later, one can still
 include
 the features in `dot` if desired.

 `mdot` will have a default parameter `optimize`.  If `optimize==True` the
 reordering of the multiplication is done.  Otherwise it simply chains the
 multiplications.

 I'll test and benchmark my implementation and create a pull request.

 Cheers,
  Stefan
 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion

___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Proposal: Chaining np.dot with mdot helper function

2014-02-20 Thread Eric Moore
On Thursday, February 20, 2014, Eelco Hoogendoorn 
hoogendoorn.ee...@gmail.com wrote:

 If the standard semantics are not affected, and the most common
 two-argument scenario does not take more than a single if-statement
 overhead, I don't see why it couldn't be a replacement for the existing
 np.dot; but others mileage may vary.


 On Thu, Feb 20, 2014 at 11:34 AM, Stefan Otte 
 stefan.o...@gmail.comjavascript:_e(%7B%7D,'cvml','stefan.o...@gmail.com');
  wrote:

 Hey,

 so I propose the following.  I'll implement a new function `mdot`.
 Incorporating the changes in `dot` are unlikely. Later, one can still
 include
 the features in `dot` if desired.

 `mdot` will have a default parameter `optimize`.  If `optimize==True` the
 reordering of the multiplication is done.  Otherwise it simply chains the
 multiplications.

 I'll test and benchmark my implementation and create a pull request.

 Cheers,
  Stefan
 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.orgjavascript:_e(%7B%7D,'cvml','NumPy-Discussion@scipy.org');
 http://mail.scipy.org/mailman/listinfo/numpy-discussion


 Another consideration here is that we need a better way to work with
stacked matrices such as np.linalg handles now.  Ie I want to compute the
matrix product of two (k, n, n) arrays producing a (k,n,n) result.  Near
as  I can tell there isn't a way to do this right now that doesn't involve
an explicit loop. Since dot will return a (k, n, k, n) result. Yes this
output contains what I want but it also computes a lot of things that I
don't want too.

It would also be nice to be able to do a matrix product reduction, (k, n,
n) - (n, n) in a single line too.

Eric
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Proposal: Chaining np.dot with mdot helper function

2014-02-20 Thread Eelco Hoogendoorn
Erik; take a look at np.einsum

The only reason against such dot semantics is that there isn't much to be
gained in elegance that np.einsum already provides, For a plain chaining,
multiple arguments to dot would be an improvement; but if you want to go
for more complex products, the elegance of np.einsum will be hard to beat


On Thu, Feb 20, 2014 at 3:27 PM, Eric Moore e...@redtetrahedron.org wrote:



 On Thursday, February 20, 2014, Eelco Hoogendoorn 
 hoogendoorn.ee...@gmail.com wrote:

 If the standard semantics are not affected, and the most common
 two-argument scenario does not take more than a single if-statement
 overhead, I don't see why it couldn't be a replacement for the existing
 np.dot; but others mileage may vary.


 On Thu, Feb 20, 2014 at 11:34 AM, Stefan Otte stefan.o...@gmail.comwrote:

 Hey,

 so I propose the following.  I'll implement a new function `mdot`.
 Incorporating the changes in `dot` are unlikely. Later, one can still
 include
 the features in `dot` if desired.

 `mdot` will have a default parameter `optimize`.  If `optimize==True` the
 reordering of the multiplication is done.  Otherwise it simply chains the
 multiplications.

 I'll test and benchmark my implementation and create a pull request.

 Cheers,
  Stefan
 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion


 Another consideration here is that we need a better way to work with
 stacked matrices such as np.linalg handles now.  Ie I want to compute the
 matrix product of two (k, n, n) arrays producing a (k,n,n) result.  Near
 as  I can tell there isn't a way to do this right now that doesn't involve
 an explicit loop. Since dot will return a (k, n, k, n) result. Yes this
 output contains what I want but it also computes a lot of things that I
 don't want too.

 It would also be nice to be able to do a matrix product reduction, (k, n,
 n) - (n, n) in a single line too.

 Eric

 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion


___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Proposal: Chaining np.dot with mdot helper function

2014-02-20 Thread Nathaniel Smith
If you send a patch that deprecates dot's current behaviour for ndim2,
we'll probably merge it. (We'd like it to function like you suggest, for
consistency with other gufuncs. But to get there we have to deprecate the
current behaviour first.)

While I'm wishing for things I'll also mention that it would be really neat
if binary gufuncs would have a .outer method like regular ufuncs do, so
anyone currently using ndim2 dot could just switch to that. But that's a
lot more work than just deprecating something :-).

-n
On 20 Feb 2014 09:27, Eric Moore e...@redtetrahedron.org wrote:



 On Thursday, February 20, 2014, Eelco Hoogendoorn 
 hoogendoorn.ee...@gmail.com wrote:

 If the standard semantics are not affected, and the most common
 two-argument scenario does not take more than a single if-statement
 overhead, I don't see why it couldn't be a replacement for the existing
 np.dot; but others mileage may vary.


 On Thu, Feb 20, 2014 at 11:34 AM, Stefan Otte stefan.o...@gmail.comwrote:

 Hey,

 so I propose the following.  I'll implement a new function `mdot`.
 Incorporating the changes in `dot` are unlikely. Later, one can still
 include
 the features in `dot` if desired.

 `mdot` will have a default parameter `optimize`.  If `optimize==True` the
 reordering of the multiplication is done.  Otherwise it simply chains the
 multiplications.

 I'll test and benchmark my implementation and create a pull request.

 Cheers,
  Stefan
 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion


 Another consideration here is that we need a better way to work with
 stacked matrices such as np.linalg handles now.  Ie I want to compute the
 matrix product of two (k, n, n) arrays producing a (k,n,n) result.  Near
 as  I can tell there isn't a way to do this right now that doesn't involve
 an explicit loop. Since dot will return a (k, n, k, n) result. Yes this
 output contains what I want but it also computes a lot of things that I
 don't want too.

 It would also be nice to be able to do a matrix product reduction, (k, n,
 n) - (n, n) in a single line too.

 Eric

 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion


___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Proposal: Chaining np.dot with mdot helper function

2014-02-20 Thread Stefan Otte
Hey guys,

I quickly hacked together a prototype of the optimization step:
https://github.com/sotte/numpy_mdot

I think there is still room for improvements so feedback is welcome :)
I'll probably have some time to code on the weekend.

@Nathaniel, I'm still not sure about integrating it in dot. Don't a
lot of people use the optional out parameter of dot?


Best,
 Stefan



On Thu, Feb 20, 2014 at 4:02 PM, Nathaniel Smith n...@pobox.com wrote:
 If you send a patch that deprecates dot's current behaviour for ndim2,
 we'll probably merge it. (We'd like it to function like you suggest, for
 consistency with other gufuncs. But to get there we have to deprecate the
 current behaviour first.)

 While I'm wishing for things I'll also mention that it would be really neat
 if binary gufuncs would have a .outer method like regular ufuncs do, so
 anyone currently using ndim2 dot could just switch to that. But that's a
 lot more work than just deprecating something :-).

 -n

 On 20 Feb 2014 09:27, Eric Moore e...@redtetrahedron.org wrote:



 On Thursday, February 20, 2014, Eelco Hoogendoorn
 hoogendoorn.ee...@gmail.com wrote:

 If the standard semantics are not affected, and the most common
 two-argument scenario does not take more than a single if-statement
 overhead, I don't see why it couldn't be a replacement for the existing
 np.dot; but others mileage may vary.


 On Thu, Feb 20, 2014 at 11:34 AM, Stefan Otte stefan.o...@gmail.com
 wrote:

 Hey,

 so I propose the following.  I'll implement a new function `mdot`.
 Incorporating the changes in `dot` are unlikely. Later, one can still
 include
 the features in `dot` if desired.

 `mdot` will have a default parameter `optimize`.  If `optimize==True`
 the
 reordering of the multiplication is done.  Otherwise it simply chains
 the
 multiplications.

 I'll test and benchmark my implementation and create a pull request.

 Cheers,
  Stefan
 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion


 Another consideration here is that we need a better way to work with
 stacked matrices such as np.linalg handles now.  Ie I want to compute the
 matrix product of two (k, n, n) arrays producing a (k,n,n) result.  Near as
 I can tell there isn't a way to do this right now that doesn't involve an
 explicit loop. Since dot will return a (k, n, k, n) result. Yes this output
 contains what I want but it also computes a lot of things that I don't want
 too.

 It would also be nice to be able to do a matrix product reduction, (k, n,
 n) - (n, n) in a single line too.

 Eric

 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion


 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion

___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Proposal: Chaining np.dot with mdot helper function

2014-02-20 Thread Nathaniel Smith
On Thu, Feb 20, 2014 at 1:35 PM, Stefan Otte stefan.o...@gmail.com wrote:
 Hey guys,

 I quickly hacked together a prototype of the optimization step:
 https://github.com/sotte/numpy_mdot

 I think there is still room for improvements so feedback is welcome :)
 I'll probably have some time to code on the weekend.

 @Nathaniel, I'm still not sure about integrating it in dot. Don't a
 lot of people use the optional out parameter of dot?

The email you're replying to below about deprecating stuff in 'dot'
was in reply to Eric's email about using dot on arrays with shape (k,
n, n), so those comments are unrelated to the mdot stuff.

I wouldn't mind seeing out= arguments become kw-only in general, but
even if we decided to do that it would take a long deprecation period,
so yeah, let's give up on 'dot(A, B, C, D)' as syntax for mdot.

However, the suggestion of supporting np.dot([A, B, C, D]) still seems
like it might be a good idea...? I have mixed feelings about it -- one
less item cluttering up the namespace, but it is weird and magical to
have two totally different calling conventions for the same function.

-n

 On Thu, Feb 20, 2014 at 4:02 PM, Nathaniel Smith n...@pobox.com wrote:
 If you send a patch that deprecates dot's current behaviour for ndim2,
 we'll probably merge it. (We'd like it to function like you suggest, for
 consistency with other gufuncs. But to get there we have to deprecate the
 current behaviour first.)

 While I'm wishing for things I'll also mention that it would be really neat
 if binary gufuncs would have a .outer method like regular ufuncs do, so
 anyone currently using ndim2 dot could just switch to that. But that's a
 lot more work than just deprecating something :-).

 -n

 On 20 Feb 2014 09:27, Eric Moore e...@redtetrahedron.org wrote:



 On Thursday, February 20, 2014, Eelco Hoogendoorn
 hoogendoorn.ee...@gmail.com wrote:

 If the standard semantics are not affected, and the most common
 two-argument scenario does not take more than a single if-statement
 overhead, I don't see why it couldn't be a replacement for the existing
 np.dot; but others mileage may vary.


 On Thu, Feb 20, 2014 at 11:34 AM, Stefan Otte stefan.o...@gmail.com
 wrote:

 Hey,

 so I propose the following.  I'll implement a new function `mdot`.
 Incorporating the changes in `dot` are unlikely. Later, one can still
 include
 the features in `dot` if desired.

 `mdot` will have a default parameter `optimize`.  If `optimize==True`
 the
 reordering of the multiplication is done.  Otherwise it simply chains
 the
 multiplications.

 I'll test and benchmark my implementation and create a pull request.

 Cheers,
  Stefan
 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion


 Another consideration here is that we need a better way to work with
 stacked matrices such as np.linalg handles now.  Ie I want to compute the
 matrix product of two (k, n, n) arrays producing a (k,n,n) result.  Near as
 I can tell there isn't a way to do this right now that doesn't involve an
 explicit loop. Since dot will return a (k, n, k, n) result. Yes this output
 contains what I want but it also computes a lot of things that I don't want
 too.

 It would also be nice to be able to do a matrix product reduction, (k, n,
 n) - (n, n) in a single line too.

 Eric

 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion


 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion

 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion



-- 
Nathaniel J. Smith
Postdoctoral researcher - Informatics - University of Edinburgh
http://vorpus.org
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Proposal: Chaining np.dot with mdot helper function

2014-02-18 Thread Stefan Otte
Just to give an idea about the performance implications I timed the
operations on my machine

%timeit reduce(dotp, [x, v, x.T, y]).shape
1 loops, best of 3: 1.32 s per loop

%timeit reduce(dotTp, [x, v, x.T, y][::-1]).shape
1000 loops, best of 3: 394 µs per loop

I was just interested in a nicer formulas but if the side effect is a
performance improvement I can live with that.


Pauli Virtanen posed in the issue an older discussion on the mailinglist:
http://thread.gmane.org/gmane.comp.python.numeric.general/14288/


Beste Grüße,
 Stefan



On Tue, Feb 18, 2014 at 12:52 AM,  josef.p...@gmail.com wrote:
 On Mon, Feb 17, 2014 at 4:57 PM,  josef.p...@gmail.com wrote:
 On Mon, Feb 17, 2014 at 4:39 PM, Stefan Otte stefan.o...@gmail.com wrote:
 Hey guys,

 I wrote myself a little helper function `mdot` which chains np.dot for
 multiple arrays. So I can write

 mdot(A, B, C, D, E)

 instead of these

 A.dot(B).dot(C).dot(D).dot(E)
 np.dot(np.dot(np.dot(np.dot(A, B), C), D), E)

 I know you can use `numpy.matrix` to get nicer formulas. However, most
 numpy/scipy function return arrays instead of numpy.matrix. Therefore,
 sometimes you actually use array multiplication when you think you use
 matrix multiplication. `mdot` is a simple way to avoid using
 numpy.matrix but to improve the readability.

 What do you think? Is this useful and worthy to integrate in numpy?


 I already created an issuer for this:
 https://github.com/numpy/numpy/issues/4311

 jaimefrio also suggested to do some reordering of the arrays to
 minimize computation:
 https://github.com/numpy/numpy/issues/4311#issuecomment-35295857

 statsmodels has a convenience chaindot, but most of the time I don't
 like it's usage, because of the missing brackets.

 say, you have a (1, 10) array and you use an intermediate (1,
 1) array instead of (10,10) array

 nobs = 1
 v = np.diag(np.ones(4))
 x = np.random.randn(nobs, 4)
 y = np.random.randn(nobs, 3)
 reduce(np.dot, [x, v, x.T, y]).shape


 def dotp(x, y):
 xy = np.dot(x,y)
 print xy.shape
 return xy

 reduce(dotp, [x, v, x.T, y]).shape
 (1, 4)
 (1, 1)
 (1, 3)
 (1, 3)

 def dotTp(x, y):
 xy = np.dot(x.T,y.T)
 print xy.shape
 return xy.T

 reduce(dotTp, [x, v, x.T, y][::-1]).shape
 (3, 4)
 (3, 4)
 (3, 1)
 (1, 3)

 Josef


 IIRC, for reordering I looked at this
 http://www.mathworks.com/matlabcentral/fileexchange/27950-mmtimes-matrix-chain-product

 Josef
 (don't make it too easy for people to shoot themselves in ...)



 Best,
  Stefan
 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion
 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


[Numpy-discussion] Proposal: Chaining np.dot with mdot helper function

2014-02-17 Thread Stefan Otte
Hey guys,

I wrote myself a little helper function `mdot` which chains np.dot for
multiple arrays. So I can write

mdot(A, B, C, D, E)

instead of these

A.dot(B).dot(C).dot(D).dot(E)
np.dot(np.dot(np.dot(np.dot(A, B), C), D), E)

I know you can use `numpy.matrix` to get nicer formulas. However, most
numpy/scipy function return arrays instead of numpy.matrix. Therefore,
sometimes you actually use array multiplication when you think you use
matrix multiplication. `mdot` is a simple way to avoid using
numpy.matrix but to improve the readability.

What do you think? Is this useful and worthy to integrate in numpy?


I already created an issuer for this:
https://github.com/numpy/numpy/issues/4311

jaimefrio also suggested to do some reordering of the arrays to
minimize computation:
https://github.com/numpy/numpy/issues/4311#issuecomment-35295857


Best,
 Stefan
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Proposal: Chaining np.dot with mdot helper function

2014-02-17 Thread josef . pktd
On Mon, Feb 17, 2014 at 4:39 PM, Stefan Otte stefan.o...@gmail.com wrote:
 Hey guys,

 I wrote myself a little helper function `mdot` which chains np.dot for
 multiple arrays. So I can write

 mdot(A, B, C, D, E)

 instead of these

 A.dot(B).dot(C).dot(D).dot(E)
 np.dot(np.dot(np.dot(np.dot(A, B), C), D), E)

 I know you can use `numpy.matrix` to get nicer formulas. However, most
 numpy/scipy function return arrays instead of numpy.matrix. Therefore,
 sometimes you actually use array multiplication when you think you use
 matrix multiplication. `mdot` is a simple way to avoid using
 numpy.matrix but to improve the readability.

 What do you think? Is this useful and worthy to integrate in numpy?


 I already created an issuer for this:
 https://github.com/numpy/numpy/issues/4311

 jaimefrio also suggested to do some reordering of the arrays to
 minimize computation:
 https://github.com/numpy/numpy/issues/4311#issuecomment-35295857

statsmodels has a convenience chaindot, but most of the time I don't
like it's usage, because of the missing brackets.

say, you have a (1, 10) array and you use an intermediate (1,
1) array instead of (10,10) array

IIRC, for reordering I looked at this
http://www.mathworks.com/matlabcentral/fileexchange/27950-mmtimes-matrix-chain-product

Josef
(don't make it too easy for people to shoot themselves in ...)



 Best,
  Stefan
 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Proposal: Chaining np.dot with mdot helper function

2014-02-17 Thread Jaime Fernández del Río
Perhaps you could reuse np.dot, by giving its second argument a default
None value, and passing a tuple as first argument, i.e. np.dot((a, b, c))
would compute a.dot(b).dot(c), possibly not in that order.

As is suggested in the matlab thread linked by Josef, if you do implement
an optimal ordering algorithm, then precalculating the ordering and passing
it in as an argument should be an option.

If I get a vote, I am definitely +1 on this, especially the more
sophisticated version.

On Feb 17, 2014 1:40 PM, Stefan Otte stefan.o...@gmail.com wrote:
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Proposal: Chaining np.dot with mdot helper function

2014-02-17 Thread Eelco Hoogendoorn
considering np.dot takes only its binary positional args and a single
defaulted kwarg, passing in a variable number of positional args as a list
makes sense. Then just call the builtin reduce on the list, and there you
go.

I also generally approve of such semantics for binary associative
operations.


On Mon, Feb 17, 2014 at 11:27 PM, Jaime Fernández del Río 
jaime.f...@gmail.com wrote:

 Perhaps you could reuse np.dot, by giving its second argument a default
 None value, and passing a tuple as first argument, i.e. np.dot((a, b, c))
 would compute a.dot(b).dot(c), possibly not in that order.

 As is suggested in the matlab thread linked by Josef, if you do implement
 an optimal ordering algorithm, then precalculating the ordering and passing
 it in as an argument should be an option.

 If I get a vote, I am definitely +1 on this, especially the more
 sophisticated version.

 On Feb 17, 2014 1:40 PM, Stefan Otte stefan.o...@gmail.com wrote:

 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion


___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Proposal: Chaining np.dot with mdot helper function

2014-02-17 Thread josef . pktd
On Mon, Feb 17, 2014 at 4:57 PM,  josef.p...@gmail.com wrote:
 On Mon, Feb 17, 2014 at 4:39 PM, Stefan Otte stefan.o...@gmail.com wrote:
 Hey guys,

 I wrote myself a little helper function `mdot` which chains np.dot for
 multiple arrays. So I can write

 mdot(A, B, C, D, E)

 instead of these

 A.dot(B).dot(C).dot(D).dot(E)
 np.dot(np.dot(np.dot(np.dot(A, B), C), D), E)

 I know you can use `numpy.matrix` to get nicer formulas. However, most
 numpy/scipy function return arrays instead of numpy.matrix. Therefore,
 sometimes you actually use array multiplication when you think you use
 matrix multiplication. `mdot` is a simple way to avoid using
 numpy.matrix but to improve the readability.

 What do you think? Is this useful and worthy to integrate in numpy?


 I already created an issuer for this:
 https://github.com/numpy/numpy/issues/4311

 jaimefrio also suggested to do some reordering of the arrays to
 minimize computation:
 https://github.com/numpy/numpy/issues/4311#issuecomment-35295857

 statsmodels has a convenience chaindot, but most of the time I don't
 like it's usage, because of the missing brackets.

 say, you have a (1, 10) array and you use an intermediate (1,
 1) array instead of (10,10) array

 nobs = 1
 v = np.diag(np.ones(4))
 x = np.random.randn(nobs, 4)
 y = np.random.randn(nobs, 3)
 reduce(np.dot, [x, v, x.T, y]).shape


 def dotp(x, y):
xy = np.dot(x,y)
print xy.shape
return xy

 reduce(dotp, [x, v, x.T, y]).shape
(1, 4)
(1, 1)
(1, 3)
(1, 3)

 def dotTp(x, y):
xy = np.dot(x.T,y.T)
print xy.shape
return xy.T

 reduce(dotTp, [x, v, x.T, y][::-1]).shape
(3, 4)
(3, 4)
(3, 1)
(1, 3)

Josef


 IIRC, for reordering I looked at this
 http://www.mathworks.com/matlabcentral/fileexchange/27950-mmtimes-matrix-chain-product

 Josef
 (don't make it too easy for people to shoot themselves in ...)



 Best,
  Stefan
 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion