数组广播与numpy

时间:2010-08-09 18:56:50

标签: python numpy

如何使用Python的隐式循环编写以下循环?

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

2 个答案:

答案 0 :(得分: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的原始定义将会丢失。这对你的目的来说可能没问题。

答案 1 :(得分:1)

这里有一个视频系列,您可能会发现它很有用:

http://showmedo.com/videotutorials/video?name=10370070&fromSeriesID=1037

请注意,它是教程系列的一部分,讨论了广泛的numpy主题。

仅供参考。