2010-08-09 70 views
2

如何使用Python的隱式循環編寫以下循環?數組廣播與numpy

def kl(myA, myB, a, b): 
    lots of stuff that assumes all inputs are scalars 

x, y = meshgrid(inclusive_arange(0.0, xsize, 0.10),\ 
       inclusive_arange(0.0, ysize, 0.10)) 

for j in range(x.shape[0]): 
    for i in range(x.shape[1]): 
     z[j, i] = kl(x[j, i], y[j, i]) 

我要像做

z = kl(x, y) 

但給:

TypeError: only length-1 arrays can be converted to Python scalars 
+3

「隱式循環」?你可以定義嗎? – nosklo 2010-08-09 18:59:54

+0

我想我的意思是「陣列廣播」:) – 2010-08-09 19:11:03

回答

5

你問只在numpy的存在的能力,這就是所謂的array broadcasting,不隱循環。在數組上廣播標量操作的函數稱爲通用函數,或ufunc。許多基本的Numpy功能都屬於這種類型。

您可以使用numpy.frompyfunc將您現有的功能kl轉換爲ufunc。

kl_ufunc = numpy.frompyfunc(kl, 4, 1) 
... 
z = kl_ufunc(x + 1.0, y + 1.0, myA, myB) 

當然,如果你願意,你可以調用ufunc kl而不是kl_ufunc,但隨後的kl原來的定義將丟失。這可能適合你的目的。

+0

謝謝!這工作。 – 2010-08-09 19:10:30