【问题标题】:Outer product of a vector with itself M-times向量与自身 M 次的外积
【发布时间】:2018-12-26 23:02:59
【问题描述】:

我想从长度为 n 的向量 x 创建一个 M 模式、n 维张量 A,使得

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

我目前的代码是

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

我对 Python 编码比较陌生,所以我不确定是否有更紧凑/方便的方法来计算这个张量。

【问题讨论】:

    标签: python numpy multidimensional-array


    【解决方案1】:

    我们可以利用np.ix_ 创建输入数组的开放网格版本,然后将它们提供给np.multiply.reduce 以对所有这些进行元素乘法减少,就像这样 -

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

    扩展到其他支持的 ufuncs

    我们可以将其扩展到其他具有 reduce 方法的 ufunc。因此,例如执行外部addition,它将是-

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

    等等。

    有关支持此功能的ufuncs 的完整列表,请参阅docs。在Grep-ing 之后,我得到了以下支持reduce 方法的ufunc,因此可以利用之前发布的方法:

    加、减、乘、除、logaddexp、logaddexp2、true_divide、 floor_divide, 负数, 正数, 幂, 余数, mod, fmod, divmod, 绝对,晶圆厂,rint,标志,重质,conj,exp,exp2,log,log2, log10, expm1, log1p, sqrt, square, cbrt, 倒数, gcd, lcm, sin, cos, tan, arcsin, arccos, arctan, arctan2, hypot, sinh, cosh, tanh, arcsinh, arccosh, arctanh, deg2rad, rad2deg, bitwise_and, bitwise_or, bitwise_xor,反转,left_shift,right_shift,更大,更大的平等, 更少,less_equal,not_equal,equal,logical_and,logical_or, logical_xor, logical_not, 最大值, 最小值, fmax, fmin, isfinite, isinf、isnan、isnat、fabs、signbit、copysign、nextafter、间距、 modf, ldexp, frexp, fmod, floor, ceil, trunc

    【讨论】:

    • 奇怪的是,您的 ix_ 方法比 OP 的循环慢 2 倍或更多倍。
    • 谢谢!为了让我能理解发生了什么,您能否详细说明 ix() 中的*[x]*M?这是 Python 中的一个符号,还是 ix 的某些属性——您链接的参考指南中没有提到它?
    • @Gillithonnen 基本上使用[x]*M 将x 的副本创建为一个列表,然后使用*[x]*M 解包,因此每个副本都作为一个输入提供给np.ix_,从而创建开放网格他们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2013-01-17
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    相关资源
    最近更新 更多