【问题标题】:Numpy vectorize and atomic vectorsNumpy 向量化和原子向量
【发布时间】:2015-07-27 03:46:44
【问题描述】:

我想实现一个函数,它像预期的数组上的 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]])

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

【问题讨论】:

  • 您尝试实现的功能已经存在:np.add.

标签: python numpy vectorization


【解决方案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 列表,可选

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

【讨论】:

  • 首先谢谢! -- 好的,现在数据类型是正确的,但顺序仍然告诉我,它没有按需要向量化 ([1, 2]), [3, 4]) != ([1, 3]), [ 2, 4])
  • 请注意,答案是一个数组元组,可以用作a, b = triv_vec([1,2], [3,4])。该元组的长度与otypes 相同,并且与triv 返回的元组长度相同。
【解决方案2】:

我最初的问题是矢量化正在执行内部类型转换并运行内部优化循环以及这会对性能产生多大影响。所以这里是答案:

确实如此,但并非只有

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

此外,元组生成函数未按预期进行矢量化,例如映射函数 map(make_tuple, v1, v2),它是竞争中明显较松的,执行时间慢了 100 倍:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2017-04-29
    • 1970-01-01
    相关资源
    最近更新 更多