代码之家  ›  专栏  ›  技术社区  ›  Xaree Lee

numpy:将两个数组组合成一个矩阵,然后用lambda映射

  •  1
  • Xaree Lee  · 技术社区  · 6 年前

    我想把两个结合起来 numpy.ndarray 具有 (m, n) 元素变成 m x n 矩阵,然后对映射值应用函数/lambda。

    例如:

    import numpy as np
    X = np.array([1,2,3])
    Y = np.array([4,5,6,7])
    Z = cross_combine(X, Y)
    # combine two arrays into a matrix containing the tuple (Xi, Yj)
    # array([[(1,4), (1,5), (1,6), (1,7)],
    #        [(2,4), (2,5), (2,6), (2,7)],
    #        [(3,4), (3,5), (3,6), (3,7)]])
    
    Z = Z.map(lambda x, y: x * y)
    # map values with a lambda or a function
    # array([[4, 5, 6, 7],
    #        [8, 10, 12, 14],
    #        [12, 15, 18, 21]])
    

    映射函数将是复杂的。什么是 cross_combine map 函数在numpy中?我怎么能轻易做到呢?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Dani Mesejo    6 年前

    对于您的特定示例,可以使用 np.meshgrid reduce :

    import numpy as np
    
    
    def mesh(values):
        return np.array(np.meshgrid(*values)).T
    
    X = [1,2,3]
    Y = [4,5,6,7]
    
    Z = mesh([X, Y])
    
    result = np.multiply.reduce(Z, axis=2)
    print(result)
    

    产量

    [[ 4  5  6  7]
     [ 8 10 12 14]
     [12 15 18 21]]
    

    对于自定义函数,可以使用 np.frompyfunc :

    def_mult = np.frompyfunc(lambda x, y: x * y, 2, 1)
    result = def_mult.reduce(Z, axis=2)
    print(result)
    

    产量

    [[4 5 6 7]
     [8 10 12 14]
     [12 15 18 21]]
    
        2
  •  1
  •   yatu Sayali Sonawane    6 年前

    您可以使用列表理解:

    X = [1,2,3]
    Y = [4,5,6,7]
    

    使用 itertools.product 在获取两个列表的笛卡尔积的列表理解中,保留指定的嵌套列表结构:

    Z = [list(product([x],Y)) for x in X]
    #[[(1, 4), (1, 5), (1, 6), (1, 7)],
    # [(2, 4), (2, 5), (2, 6), (2, 7)],
    # [(3, 4), (3, 5), (3, 6), (3, 7)]]
    

    并使用嵌套列表压缩应用保留结构的函数:

    [[x*y for x,y in z] for z in Z]
    #[[4, 5, 6, 7], [8, 10, 12, 14], [12, 15, 18, 21]]
    
        3
  •  0
  •   javidcf    6 年前

    你可以这样做:

    import numpy as np
    
    X = [1, 2, 3]
    Y = [4, 5, 6, 7]
    Z = np.tensordot(X, Y, axes=0)
    print(Z)
    # [[ 4  5  6  7]
    #  [ 8 10 12 14]
    #  [12 15 18 21]]
    

    对于其他操作,您可以执行以下操作:

    import numpy as np
    
    X = [1, 2, 3]
    Y = [4, 5, 6, 7]
    X2d = np.asarray(X)[:, np.newaxis]
    Y2d = np.asarray(Y)[np.newaxis, :]
    
    print(X2d * Y2d)
    # [[ 4  5  6  7]
    #  [ 8 10 12 14]
    #  [12 15 18 21]]
    print(X2d + Y2d)
    # [[ 5  6  7  8]
    #  [ 6  7  8  9]
    #  [ 7  8  9 10]]
    print(X2d ** Y2d)
    # [[   1    1    1    1]
    #  [  16   32   64  128]
    #  [  81  243  729 2187]]
    

    编辑:或者实际上只是使用:

    import numpy as np
    
    X = [1, 2, 3]
    Y = [4, 5, 6, 7]
    
    print(np.multiply.outer(X, Y))
    # [[ 4  5  6  7]
    #  [ 8 10 12 14]
    #  [12 15 18 21]]
    print(np.add.outer(X, Y))
    # [[ 5  6  7  8]
    #  [ 6  7  8  9]
    #  [ 7  8  9 10]]
    print(np.power.outer(X, Y))
    # [[   1    1    1    1]
    #  [  16   32   64  128]
    #  [  81  243  729 2187]]