在 numpy 中向量化一个重要的函数

计算科学 Python 麻木的
2021-12-16 18:28:35

我有一个二维 numpy 数组,形状(100,3)

a = np.random((100,3))

我想调用一个函数fun

b = fun(a)

该函数当前定义为:

@np.vectorize
def fun(r):
  if r <= 0.0: return 0.0
  else:        return min(2.0/(1.0 + r), 2.0*r/(1.0 + r))

这很有趣。但我想以一种更 numpythonic(因此更有效)的方式来表达这一点。我试过了:

def fun(r):
  ans = zeros_like(r)
  ans[r > 0.0] = min(2.0/(1.0 + r), 2.0*r/(1.0 + r))
  return ans

但这不起作用,因为min没有做我想要的。我也试过:

def fun(r):
  return np.piecewise(r
                     , [r <= 0.0, r > 0.0]
                     , [0.0, lambda x: min(2.0/(1.0 + x), 2.0*x/(1.0 + x))]
                     )

但出于类似的原因,这不起作用。那么我该怎么做呢?

2个回答
    def f(r):
        return 2 * np.clip(r, 0, 1) / (r + 1)

感谢@clipper 和@christianclason,我发现了一些可行的方法:

def fun(r):
  np.clip(r, 0.0, r, out=r)
  return 2.0 * np.minimum(1.0, r) / (1.0 + r)

我的程序总运行时间减少了大约 20%!不幸的是,现在的代码看起来垃圾多了 20%。