如何使用numpy.vectorize或numpy.frompyfunc

1 投票
1 回答
6539 浏览
提问于 2025-04-17 02:26

[编辑:我稍微整理了一下这个例子,所以我的代码没有清理得很好。我的问题主要是,如何将一个子数组传递给一个使用numpy.vectorize的函数,而不是特别针对这个例子。]

我搞不清楚怎么用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的函数,让每个子数组作为函数的参数呢?

1 个回答

5

你遇到的一个问题是,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函数应该有返回值,而不仅仅是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帖子上的编辑,这让这个回答看起来有点奇怪。

撰写回答