【问题标题】:how to use numpy.vectorize or numpy.frompyfunc如何使用 numpy.vectorize 或 numpy.frompyfunc
【发布时间】:2011-09-16 13:42:46
【问题描述】:

[编辑:我有点刷这个例子,所以我没有很好地清理我的代码。我的问题更多的是,如何将子数组传递给 numpy.vectorize-d 函数,而不是专门针对此示例。]

我不知道如何使用 numpy.vectorize 或 numpy.frompyfunc 对将数组作为参数的命令进行矢量化。

让我们想想这个简单的例子(我知道这是一个非常基本的例子,我根本不需要使用 numpy.vectorize。我只是要求一个例子):

aa = [[1,2,3,4], [2,3,4,5], [5,6,7,8], [9,10,11,12]]
bb = [[100,200,300,400], [100,200,300,400], [100,200,300,400], [100,200,300,400]]

我想对一个函数进行向量化,该函数将 aa 和 bb 的每个子数组的第二个元素相加。在这个例子中,我想返回一个数组 [202 203 206 210]

但是这样的代码不起作用:

def vec2(bsub, asub):
    return bsub[1] + asub[1]

func2 = np.vectorize(vec2)
func2( bb, aa )

与 numpy.frompyfunc 类似的事情没有运气。

我的问题是,如何将子数组列表传递到 numpy.vectorize-d 函数中,并让每个子数组成为函数的参数?

【问题讨论】:

    标签: python numpy vectorization


    【解决方案1】:

    您的一个问题是 aa 和 bb 是列表,而不是 numpy.array()。你应该这样做:

    aa = np.array([[1,2,3,4], [2,3,4,5], [5,6,7,8], [9,10,11,12]])
    bb = np.array([[100,200,300,400], [100,200,300,400], [100,200,300,400], [100,200,300,400]])
    

    我注意到的第二件事是,要获取每个子数组的第二个元素,您需要 aa[:,1],而不是 aa[2]

    第三,你的vec2 函数应该是return,而不仅仅是print

    最后一个问题是您的vec2 函数应该对整数而不是数组进行操作,并且您应该将切片传递给函数,而不是完整的数组。更正后的版本(返回预期的输出)是:

    import numpy as np
    aa = np.array([[1,2,3,4], [2,3,4,5], [5,6,7,8], [9,10,11,12]])
    bb = np.array([[100,200,300,400], [100,200,300,400], [100,200,300,400], [100,200,300,400]])
    
    def vec2(a, b):
        return a + b
    
    func2 = np.vectorize(vec2)
    print func2(bb[:,1], aa[:,1])
    

    注意 OP 帖子上的 EDITS,这使得这个答案看起来有点奇怪。

    【讨论】:

    • 感谢您的 cmets。我有点刷这个例子,所以我没有很好地清理我的代码。我的问题更多的是,如何将子数组传递给 numpy.vectorize-d 函数,而不是专门针对此示例。
    • 您正在将一个子数组传递给矢量化函数...您有什么上面没有完成的操作?也许它应该进入一个新的、更清晰的问题。
    猜你喜欢
    • 2018-11-07
    • 2021-11-05
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2016-04-02
    • 2014-12-06
    相关资源
    最近更新 更多