[Numpy-discussion] tensor ops in dim > 3?
oliphant at ee.byu.edu
Tue Aug 27 16:38:03 EDT 2002
> I have a rank three n-dim tensor A. For two of the axes I want to perform
> v^t A v (a quadratic form with scalar output, where v is a vector). The
> final output should be a vector. I also need to compute the derivative of
> this with respect to v. This involves symmetrizing and matrix-vector
> multiplication (2 sym(A)v using two axes of A only, which gives a vector)
> with the final result being a matrix.
I'm not exactly sure what you mean by a rank three n-dim tensor (in
Numeric the rank is the number of dimensions in the array).
But, I think you can accomplish what you desire in two different ways:
1) If A has N dimensions and you want to perform the reduction over axis
I'll label a1 and a2 (that is a1 is the axis for the v^t*A sum while a2
is the axis for the A*v sum). Then I think this should work (if a2 > a1).
ex1 = [Numeric.NewAxis]*(N-1)
ex1[a1] = slice(None)
ex2 = [Numeric.NewAxis]*N
ex2[a2] = slice(None)
Nar = Numeric.add.reduce
result = Nar(v[ex1]*Nar(A*v[ex2],axis=a2),axis=a1)
# I think you need a recent version of Numeric for the axis keyword
# to be defined here. Otherwise, just pass a2 and a1 as arguments
# without the keyword.
2) Using dot (requires transposing the matrix) as dot only operates over
certain dimensions --- I would not try this.
More information about the NumPy-Discussion