Numpy: outer product of n vectors

前端 未结 2 863
灰色年华
灰色年华 2020-12-10 05:55

I\'m trying to do something simple in numpy, and I\'m sure there should be an easy way of doing it.

Basically, I have a list of n vectors with various l

相关标签:
2条回答
  • 2020-12-10 06:42

    You use use following one line code:

    reduce(np.multiply, np.ix_(*vs))
    

    np.ix_() will do the outer broadcast, you need reduce, but you can pass the ufunc np.multiply without lambda function.

    Here is the comparing:

    import numpy as np
    vs = [np.r_[1,2,3.0],np.r_[4,5.0],np.r_[6,7,8.0]]
    shape = map(len, vs)
    
     # specify the orientation of each vector
    newshapes = np.diag(np.array(shape)-1)+1
    reshaped = [x.reshape(y) for x,y in zip(vs, newshapes)]
    
    # direct product
    A = reduce(lambda a,b: a*b, reshaped, 1)
    B = reduce(np.multiply, np.ix_(*vs))
    
    np.all(A==B)
    

    The reuslt:

    True
    
    0 讨论(0)
  • 2020-12-10 06:49

    There is an alternative line of code:

    reduce(np.multiply.outer, vs)
    

    It is more transparent for me than np.ix_(*vs) construction and support multidimensional arrays like in this question.

    Timings are the same within a tolerance:

    import numpy as np
    from functools import reduce
    
    def outer1(*vs):
        return np.multiply.reduce(np.ix_(*vs))
    def outer2(*vs):
        return reduce(np.multiply.outer, vs)
    
    v1 = np.random.randn(100)
    v2 = np.random.randn(200)
    v3 = np.random.randn(300)
    v4 = np.random.randn(50)
    
    %timeit outer1(v1, v2, v3, v4)
    # 1 loop, best of 3: 796 ms per loop
    
    %timeit outer2(v1, v2, v3, v4)
    # 1 loop, best of 3: 795 ms per loop
    
    np.all(outer1(v1, v2, v3, v4) == outer2(v1, v2, v3, v4))
    # True
    
    0 讨论(0)
提交回复
热议问题