如何使用numpy.vectorize或numpy.frompyfunc
[编辑:我稍微整理了一下这个例子,所以我的代码没有清理得很好。我的问题主要是,如何将一个子数组传递给一个使用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帖子上的编辑,这让这个回答看起来有点奇怪。