Numpy矢量化和原子矢量

时间:2015-05-15 09:17:11

标签: python numpy vectorization

我想实现一个像数组中的numpy.sum函数一样工作的函数,例如: np.sum([2,3],1)= [3,4]和np.sum([1,2],[3,4])= [4,6]。

然而,一个微不足道的测试实现已经表现得有些尴尬:

import numpy as np

def triv(a, b): return a, b

triv_vec = np.vectorize(fun, otypes = [np.int])
triv_vec([1,2],[3,4])  

结果:

array([0, 0])

而不是预期的结果:

array([[1,3], [2,4]])

任何想法,这里发生了什么? THX

2 个答案:

答案 0 :(得分:2)

您需要otypes=[np.int,np.int]

triv_vec = np.vectorize(triv, otypes=[np.int,np.int])
print triv_vec([1,2],[3,4])
(array([1, 2]), array([3, 4]))

otypes:str或dtypes列表,可选

  

输出数据类型。必须将其指定为typecode字符串或数据类型说明符列表。 每个输出应该有一个数据类型说明符。

答案 1 :(得分:0)

我最初的问题是,矢量化正在进行内部类型转换并运行内部优化的循环以及这将影响性能的程度。所以这就是答案:

确实如此,但只有<23%的效果并不像我想象的那么大。

import numpy as np

def make_tuple(a, b): return tuple([a, b])

make_tuple_vec = np.vectorize(make_tuple, otypes = [np.int, np.int])

v1 = np.random.random_integers(-5, high = 5, size = 100000)
v2 = np.random.random_integers(-5, high = 5, size = 100000)

%timeit [tuple([i,j]) for i,j in zip(v1,v2)] # ~ 596 µs per loop

%timeit make_tuple_vec(v1, v2) # ~ 544 µs per loop

此外,元组生成函数没有按预期进行矢量化,例如,地图功能图(make_tuple,v1,v2),这是竞争对手的明显宽松,减少了100倍的执行时间:

%timeit map(make_tuple, v1, v2) # ~ 64.4 ms per loop