2015-05-15 44 views
1

我想實現一個函數,它像數組上的numpy.sum函數一樣工作,就像預期的那樣。 np.sum([2,3],1)= [3,4]和np.sum([1,2],[3,4])= [4,6]。Numpy向量化和原子向量

然而一個簡單的測試實施已經表現莫名其妙的尷尬:

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

+0

您嘗試已經實現了該功能存在:'np.add'。 – Jaime

回答

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字符串或一個數據類型說明符列表。 每個輸出應該有一個數據類型說明符。

+0

先謝謝! - 好吧,現在數據類型是正確的,但是順序告訴我,它並沒有按照需要向量化([1,2]),[3,4])!=([1,3]),[ 2,4]) – donbunkito

+0

@donbunkito,你的代碼在哪裏做的? –

+0

注意答案是數組的元組,可以用作'a,b = triv_vec([1,2],[3,4])''。該元組的長度與'otypes'相同,長度與'triv'返回的元組的長度相同。 – hpaulj

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倍慢exectution時間競爭的明確寬鬆:

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