numpy的矢量化和原子矢量(Numpy vectorize and atomic vectors)

2019-10-23 03:35发布

我想执行该阵列上的工作方式类似于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]])

任何想法,这是怎么回事? 谢谢

Answer 1:

您需要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的列表,可选

输出的数据类型。 它必须被指定为一个的类型代码的字符串或数据类型说明符的列表。 应该有用于每个输出一个数据类型说明符。



Answer 2:

我原来的问题是专门的事实,矢量化正在进行内部型铸造和运行优化的内部循环,这多少会影响性能。 因此,这里的答案:

确实如此,但并非只有<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倍慢exectution时间竞争的明确宽松的:

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


文章来源: Numpy vectorize and atomic vectors