Producto exterior de un vector consigo mismo M-times

Me gustaría crear un tensor A n-dimensional en modo M a partir de un vector x de longitud n tal que

A_[i_1, i_2, ... , i_M] = x[i_1] * x[i_2] * ... * x[i_M]. 

El código que tengo hasta ahora es

 A=np.multiply.outer(x,x) for i in range(M-2): A=np.multiply.outer(A,x) 

Soy bastante nuevo en la encoding en Python, así que no estoy seguro de si existe una forma más compacta / conveniente de calcular este tensor.

Podríamos usar np.ix_ para crear versiones de cuadrícula abiertas de la matriz de entrada y luego alimentarlas a np.multiply.reduce para obtener reducciones de multiplicación por elementos para todas esas, como por ejemplo:

 A = np.multiply.reduce(np.ix_(*[x]*M)) 

Extendiendo a otros ufuncs de soporte

Podríamos extender esto a otros ufuncs que tienen el método de reduce . Entonces, por ejemplo, para realizar una addition externa, sería –

 np.add.reduce(np.ix_(*[x]*M)) 

y así.

Para obtener una lista completa de los ufuncs que admiten esta función, consulte los docs . Después de Grep -ing para esos, obtuve los siguientes ufuncs que admiten el método de reduce y, por lo tanto, podría aprovechar el enfoque publicado anteriormente:

sumr, restar, multiplicar, dividir, logaddexp, logaddexp2, true_divide, floor_divide, negativo, positivo, poder, rest, mod, fmod, divmod, absolute, fabs, rint, sign, heaviside, conj, exp, exp2, log2, log2, log10, expm1, log1p, sqrt, square, cbrt, reciproco, gcd, lcm, sin, cos, tan, arcsin, arccos, arctan, arctan2, hypot, sinh, cosh, tanh, arcsinh, arccosh, arctanh, deg2rad, rad2deg bitwise_and, bitwise_or, bitwise_xor, invert, left_shift, right_shift, mayor, mayor_equal, less, less_equal, not_equal, igual, logical_and, logical_or, logical_xor, logical_not, maximum, min, min, isfinite, isinf, isnan, isn, isnn, nf. signbit, copysign, nextafter, espaciado, modf, ldexp, frexp, fmod, floor, ceil, trunc