假设我们有一个非常简单的函数,例如:
import scipy as sp
def func(x, y):
return x + y
这个函数显然适用于几种Python内置数据类型,例如字符串、列表、整数、浮点数、数组等。由于我们特别关注数组,因此我们考虑两个数组:
x = sp.array([-2, -1, 0, 1, 2])
y = sp.array([-2, -1, 0, 1, 2])
xx = x[:, sp.newaxis]
yy = y[sp.newaxis, :]
>>> func(xx, yy)
这将返回
array([[-4, -3, -2, -1, 0],
[-3, -2, -1, 0, 1],
[-2, -1, 0, 1, 2],
[-1, 0, 1, 2, 3],
[ 0, 1, 2, 3, 4]])
正如我们所预期的那样。
现在,如果有人想要将数组作为以下函数的输入,该怎么办呢?
def func2(x, y):
if x > y:
return x + y
else:
return x - y
执行 >>>func(xx, yy)
会引发错误。
最常见的方法是使用scipy/numpy中的 sp.vectorize
函数。然而,这种方法被证明并不是很高效。有没有更加健壮的方法可以将任何函数广播到numpy数组上呢?
如果重写代码以适应数组的方式是唯一的方法,那么在此处提及会很有帮助。
where
确实看起来很好,但你有考虑过在实现时对性能的影响吗?谢谢。 - eatN=10000
时,我的小电脑就会卡住 :)。当x
的形状为(10000,)时,func2*
的返回值的形状为(10000,10000)。使用dtype = float64
,至少需要760 MiB。这使我进入了缓冲区交换的领域。无论如何,我倾向于相信随着N的增长,结果的排序不会改变。你认为呢? - unutbu