[Numpy-discussion] matrix multipln takes too much time

lorenzo bolla lbolla@gmail....
Tue Dec 25 10:28:19 CST 2007


you can either use matrix multiplication (see resultmatrix2) or tensordot
(see resultmatrix3).
on my computer I have:
1.    15.6 sec with your code
2.    0.072 sec with resultmatrix2
3.    0.040 sec with tensordot (resultmatrix3) (-- which is a 400x speed)

--------------------------------------------

from numpy import *

items=25
sample=5
totalcols=8100
#matrixone=matrix(zeros((items,totalcols)))
#matrixtwo=matrix(zeros((items,totalcols)))

matrixone=matrix(random.rand(items, totalcols))
matrixtwo=matrix(random.rand(items, totalcols))

resultmatrix=matrix(zeros((items,sample)))
resultmatrix2=matrix(zeros((items,sample)))
resultmatrix3=matrix(zeros((items,sample)))

# your code
for i in range(items):
    for j in range(sample):
        tval=0.0
        for p in range(totalcols):
            tval +=matrixone[ j , p ] * matrixtwo[ i , p ]
        resultmatrix[ i, j ]=abs(tval)

# matrix multiplication
for i in range(items):
    for j in range(sample):
        resultmatrix2[ i, j ] = abs(matrixone[j,:] * matrixtwo[i,:].T)

# tensordot
resulmatrix3 = tensordot(matrixone[:sample,:], matrixtwo.T, axes=1).T

---------------------------------------

hth,
L.






On Dec 25, 2007 5:16 PM, Louis Wicker <Louis.Wicker@noaa.gov> wrote:

> Hi there - quick suggestion on Xmas morning - others are much more
> familar.
> You do not want to use a loop to do the matrix multiply, you want to use
> the intrinsic functions assoicated with matrix.
>
> So you want something like
>
> res = Math.abs( matmul(arrayone, arraytwo) )
>
> note - that is not real code, just symbolic code.  I am sure this is
> easily found in the documentation.
>
> cheers!
>
> Lou
>
>
> On Dec 25, 2007, at 8:47 AM, devnew@gmail.c om <devnew@gmail.com> w
> le-interchange-newline">
>
> hi
> i am doing some maths calculations involving matrices of double values
> using numpy.matrix ,
>
> java code for this is something like
>
> int items=25;
> int sample=5;
> int totalcols=8100;
> double[][]dblarrayone=new double[items][totalcols];
> double[][]dblarraytwo=new double[items][totalcols];
> //their elements are set elsewhere before calculation
>
> double[][] resultarray = new double[items][sample];
>
> for(int i=0;i<items;i++){
>    for(int j=0;j<sample;j++){
>        double tval=0.0;
>        for(int p=0;p<totalcols;p++)
>            tval+=dblarrayone[j][p] * dblarraytwo[i][p];
>        resultarray[i][j]=Math.abs(tval);
>
>    }
>
> }
>
> so I wanted to do the same  in python ..(may b
> recommended way..)
> i am storing the filled matrices and other values as instance variable
> of a class and access them by self.whatever...
>
> self.items=25
> self.sample=5
> self.totalcols=8100
> #self.matrixone,self.matrixtwo are numply matix objects with already
> filled elements
> #but for testing i filled it with zeros
> self.matrixone=matrix(zeros((items,totalcols)))
> self.matrixtwo=matrix(zeros((items,totalcols)))
> resultmatrix=matrix(zeros((self.items,self.sample)))
>
> for i in range(self.items):
>    for j in range(self.sample):
>         tval=0.0
>         for p in range(self.totalcols):
>            tval +=self.matrixone[ j , p ] * self.matrixtwo[ i , p ]
>         resultmatrix[ i, j ]=abs(tval)
>
>
> here I found that while the java code takes ba br>execute the code ,the
> python code takes something like 53 secs to execute !!..I am baffled
> by this ..can anyone advise me how i can improve this? (i want to code
> in python so  I can't use c,c++ , java)
>
> dn
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion@scipy.org
> http://projects.scipy.org/mailman/listinfo/numpy-discussion
>
>
> | Dr. Louis J. Wicker
> | NSSL/WRDD  Rm 4366
> | National Weather Center < "Apple-style-span" style="line-height: 16px;;
> font-size: 14px; ">
> | 120 David L. Boren Boulevard, Norman, OK 73072
> |
> | E-mail:   Louis.Wicker@noaa.gov
> | HTTP:  www.nssl.noaa.gov/~lwicker <http://www.nssl.noaa.gov/%7Elwicker>
> | Phone:    (405) 325-6340
> | Fax:        (405) 325-6780
> |
> | "Programming is not just creating strings of instructions
> | for a computer to execute.  It's also 'literary' in that you
> | are trying to communicate a program structure to
> | other humans reading the code." - Paul Rubin
> |
> |"Real efficiency comes from elegant solutions, not optimiz ed progr
> le="font-size: 14px; ">| Optimization is always just a few
> correctness-preserving transformations
> | away." - Jonathan Sobel
>
> ----------------------------------------------------------------------------
> |
> | "The contents  of this message are mine personally and
> | do not reflect any position of  the Government or NOAA."
> |
>
> ----------------------------------------------------------------------------
>
>
>
>
>
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion@scipy.org
> http://projects.scipy.org/mailman/listinfo/numpy-discussion
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://projects.scipy.org/pipermail/numpy-discussion/attachments/20071225/4267f296/attachment-0001.html 


More information about the Numpy-discussion mailing list