2010-10-26 96 views
2

是否有可能使用矢量參數在numpy中進行數組廣播?Numpy數組廣播與矢量參數

例如,我知道我能做到這一點

def bernoulli_fraction_to_logodds(fraction): 
    if fraction == 1.0: 
     return inf 
    return log(fraction/(1 - fraction)) 
bernoulli_fraction_to_logodds = numpy.frompyfunc(bernoulli_fraction_to_logodds, 1, 1) 

,並把它與整個陣列工作。如果我有一個採用2元素矢量並返回2元素矢量的函數呢?我可以傳遞一個2元素向量的數組嗎?例如,

def beta_ml_fraction(beta): 
    a = beta[0] 
    b = beta[1] 
    return a/(a + b) 
beta_ml_fraction = numpy.frompyfunc(beta_ml_fraction, 1, 1) 

不幸的是,這是行不通的。是否有與from_py_func類似的功能。當他們是2元素向量時,我可以繞過這個問題,但是當他們是n元素向量時呢?

因此,輸入(2,3)應該給0.4,但輸入[[2,3], [3,3]]應該給[0.4, 0.5]

回答

1

在處理二維向量數組時,我喜歡將x和y分量保持爲第一個索引。爲此,我大量使用轉置()

def beta_ml_fraction(beta): 
     a = beta[0] 
     b = beta[1] 
    return a/(a + b) 

arr=np.array([(2,3),(3,3)],dtype=np.float) 
print(beta_ml_fraction(arr.transpose())) 
# [ 0.4 0.5] 

這種方法的優點是,處理雙維向量的多維數組變得easiear的。

x = np.arange(18,dtype=np.float).reshape(2,3,3) 
print(x) 
#array([[[ 0., 1., 2.], 
#  [ 3., 4., 5.], 
#  [ 6., 7., 8.]], 
# 
#  [[ 9., 10., 11.], 
#  [ 12., 13., 14.], 
#  [ 15., 16., 17.]]]) 
print(beta_ml_fraction(x)) 
#array([[ 0.  , 0.09090909, 0.15384615], 
#  [ 0.2  , 0.23529412, 0.26315789], 
#  [ 0.28571429, 0.30434783, 0.32  ]]) 
+0

謝謝,這解決了我的問題。 – 2010-10-26 22:00:14

4

我不認爲frompyfunc可以做到這一點,雖然我可能是錯的。

關於np.vectorizeA. M. Archibald wrote

事實上,任何通過 Python代碼無二的 「合二 標量」 將是緩慢的。在Python中循環的緩慢 並不是因爲 python的循環結構很慢,因爲執行python代碼是 慢。所以矢量化是一種欺騙 - 它實際上並不快,但它很方便。

所以np.frompyfunc(和np.vectorize)只是語法糖 - 他們不使Python函數跑得更快。 意識到後,我的興趣frompyfunc標記(接近零)。

Python循環沒有什麼不可讀的,所以要麼明確地使用一個,要麼重寫函數以真正利用numpy(通過編寫真正的向量化方程)。

import numpy as np 

def beta_ml_fraction(beta):  
    a = beta[:,0] 
    b = beta[:,1] 
    return a/(a + b) 


arr=np.array([(2,3)],dtype=np.float) 
print(beta_ml_fraction(arr)) 
# [ 0.4] 

arr=np.array([(2,3),(3,3)],dtype=np.float) 
print(beta_ml_fraction(arr)) 
# [ 0.4 0.5] 
+0

感謝有關矢量化的信息。 – 2010-10-26 22:00:51