[Numpy-discussion] doing zillions of 3x3 determinants fast
Daniel Lenski
dlenski at gmail.com
Sun Aug 24 23:48:54 EDT 2008
Hi all,
I need to take the determinants of a large number of 3x3 matrices, in
order to determine for each of N points, in which of M tetrahedral cells
they lie. I arrange the matrices in an ndarray of shape (N,M,5,3,3).
As far as I can tell, Numpy doesn't have a function to do determinants
over a specific set of axes... so I can't say:
dets = np.linalg.det(a, axis1=-1, axis2=-1)
Using an explicit Python loop is very slow... doing the determinants of
100,000 random 3x3 matrices in a loop and inserting the results into a
preallocated results array takes about 5.1 seconds.
So instead I coded up my own routine to do the determinants over the last
2 axes, based on the naive textbook formula for a 3x3 determinant:
def det3(ar):
a=ar[...,0,0]; b=ar[...,0,1]; c=ar[...,0,2]
d=ar[...,1,0]; e=ar[...,1,1]; f=ar[...,1,2]
g=ar[...,2,0]; h=ar[...,2,1]; i=ar[...,2,2]
return (a*e*i+b*f*g+c*d*h)-(g*e*c+h*f*a+i*d*b)
This is *much much* faster... it does the same 100,000 determinants in
0.07 seconds. And the results differ from linalg.det's results by less
than 1 part in 10^15 on average (w/ a std dev of about 1 part in 10^13).
Does anyone know of any well-written routines to do lots and lots of
determinants of a fixed size? My routine has a couple problems I can see:
* it's fast enough for 100,000 determinants, but it bogs due to
all the temporary arrays when I try to do 1,000,000 determinants
(=72 MB array)
* I've heard the numerical stability of the naive determinant
algorithms is fairly poor, so I'm reluctant to use this function on
real data.
Any advice will be appreciated!
Dan
More information about the NumPy-Discussion
mailing list