代码之家  ›  专栏  ›  技术社区  ›  watchtower

将自定义函数应用于numpy中的2行或更多行(或列)

  •  1
  • watchtower  · 技术社区  · 7 年前

    我是个新手 numpy. 我想对1、2或更多行(或列)应用自定义函数。我该怎么做?在将其标记为复制之前,我想指出,我发现的唯一执行此操作的线程是 how to apply a generic function over numpy rows? 和 . 这篇文章有两个问题:

    a) 作为一个初学者,我不太清楚操作是什么样的 A[:,None,:] 做

    b) 那手术对我来说不起作用。请看下面。

    import numpy as np
    M = np.array([[8, 3, 2],
                  [6, 1, 2],
                  [1, 2, 4]])
    

    现在,我想计算所有三行组合的乘积。为此,我创建了一个 习俗 只是一个例子。

    def myf(a,b): return(a*b) 
    

    我吃了 numpy 以阵列产品为例。实际的自定义函数可能不同,但无论是什么操作,该函数都将始终返回 努比 数组。i、 这将需要两个同样大小的 myf a 和 b 都是 np.array .

    两行递归相乘后的预期输出:

    如果我应用成对行操作:

    [[48,3,4],
     [6,2,8],
     [8,6,8]]
    

    或者(自定义函数的应用顺序无关紧要。因此,行在输出矩阵中的实际位置无关紧要。下面的矩阵也可以。)

    [[6,2,8],
     [48,3,4],  #row1 and 2 are swapped
     [8,6,8]]
    

    [[24, 6, 16]
     [6,  2, 12] 
     [2,  8, 4]]
    

    类似地,如果我将自定义函数应用于所有三行,我将得到:

    [48,6,16] #row-wise
    

    或

    [48,12,8] #column-wise
    

    我在阅读后尝试了几种方法,因此:

    1:

    vf=np.vectorize(myf)
    vf(M,M)
    

    但是,上述函数按元素而不是按行或列应用自定义函数。

    2:

    我还尝试:

    M[:,None,:].dot(M) #dot mimics multiplication. Python wouldn't accept `*`
    

    a) 我不知道输出是什么。

    有人能帮我吗?我非常感谢你的帮助。

    我对你敞开心扉 努比 和 scipy .


    一些专家要求提供所需的产出。让我们假设期望的输出是 [[48,3,4], [6,2,8], [8,6,8]] .

    不过,我希望您能提供一些指导,帮助我为2列或更多列和2行或更多行定制解决方案。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Nils Werner    7 年前

    您可以简单地沿着轴滚动轴 0 第th轴

    np.roll(M, -1, axis=0)
    # array([[6, 1, 2],
    #        [1, 2, 4],
    #        [8, 3, 2]])
    

    并将结果与原始数组相乘

    M * np.roll(M, -1, axis=0)
    # array([[48,  3,  4],
    #        [ 6,  2,  8],
    #        [ 8,  6,  8]])
    

    如果要合并两行以上的行,可以多次滚动:

    M * np.roll(M, -1, axis=0) * np.roll(M, -2, axis=0)
    # array([[48,  6, 16],
    #        [48,  6, 16],
    #        [48,  6, 16]])