Re: [Numpydiscussion] dot operations on multidimensional arrays
Try numpy.tensordot Nadav Original Message From: numpydiscussionbounces@scipy.org [mailto:numpydiscussionbounces@scipy.org] On Behalf Of Carsten Rostgaard Sent: Thursday, November 23, 2006 10:06 To: numpydiscussion@scipy.org Subject: [Numpydiscussion] dot operations on multidimensional arrays Hi! I am trying to use the "dot" method on multi(more than 2)dimensional arrays. Specifically I do >> y = dot(a, b) where a is a 2D array and b is a 3D array. using numpy I get the the help: " dot(...) dot(a,v) returns matrixmultiplication between a and b. The productsum is over the last dimension of a and the secondtolast dimension of b. " I then expect that >> y[i, j, k] = sum(a[i, :] * b[j, :, k]) which is actually what I get. The question is then: 1) Is there any way to change the axis for which the productsum is performed. This can of course be done by a swapaxis before and after the operation, but this makes the array noncontiguous, in which case the dot operation often makes bugs (at least in Numeric). 2) For complicated reasons we still use Numeric in our software package, and in this, "dot" behaves very strangely. According to the Numeric help: " dot(a, b) dot(a,b) returns matrixmultiplication between a and b. The productsum is over the last dimension of a and the secondtolast dimension of b. " so I would have expected again that y[i, j, k] = sum(a[i, :] * b[j, :, k]), and the dimensions actually fit, i.e. y.shape = (a.shape[0], b.shape[0], b.shape[2]), but only some rows of the result has these values!! Does anyone know what Numeric.dot(a, b) actually does when b has more than two dimensions? I use the following test script: BEGIN SCRIPT import Numeric as num # import numpy as num # make 'random' input arrays a = num.zeros((2, 5)) b = num.zeros((3, 5, 4)) a.flat[:] = num.arange(len(a.flat))  3 b.flat[:] = num.arange(len(b.flat)) + 5 # builtin dot product y1 = num.dot(a, b) # manual dot product y2 = num.zeros((a.shape[0], b.shape[0], b.shape[2])) for i in range(a.shape[0]): for j in range(b.shape[0]): for k in range(b.shape[2]): y2[i, j, k] = num.sum(a[i,:] * b[j, :, k]) # test for consistency print y1 == y2 END SCRIPT with the result: [[[1 1 1 1] [0 0 0 0] [0 0 0 0]] [[1 1 1 1] [0 0 0 0] [0 0 0 0]]] thanks a lot, Carsten Rostgaard Carsten.Rostgaard@fysik.dtu.dk _______________________________________________ Numpydiscussion mailing list Numpydiscussion@scipy.org http://projects.scipy.org/mailman/listinfo/numpydiscussion
participants (1)

Nadav Horesh