# [Numpy-discussion] Tensor-like product with extra indices?

Huaiyu Zhu huaiyu_zhu at yahoo.com
Fri Sep 13 01:46:03 CDT 2002

```Two related questions:

1. Suppose  B = ravel(A) and
B[i] corresponds to A[i0,i1,...].

Are there named functions that map the indices

(i0,i0,...) -> i

and back?  This is assuming A.shape = (m0,m1,...) is known.

2. Suppose the above function is called ravel_index and its
inverse unravel_index.

Given a list of matrices [A0, A1, ...] is there a function that
calculates a matrix B such that

B[i,j]  = A0[i0,j] * A1[i1,j] * ...

where i = ravel_index(i0, i1, ...).

What about the inverse function that turns B into C such that

C[i0,i1,...,j] = A0[i0,j] * A1[i1,j] * ...

I've considered reshape, ravel, take, put, outerproct but couldn't come
up with a combination to do it without a for-loop on j and a for-loop on
[A0,A1,...].

The above two questions I need answers right now.  But I can imagine a
need for a more general operations in the future.  Given a sequence of
arrays [A0,A1,...], produce a tensor product by picking certain indices
from each array (like i0,i1 above), while keeping some other indices
fixed (like j above).  For example, the above could be written as

B = tensor_like([A0,A1...], [(0,None,None,...), ...,
(None,....,None,0), (1,1,...1)])

As another example, if len(A.shape)==3 then

transpose(A) == tensor_like([A], [(2,), (1,), (0,)])

Huaiyu

```