【问题标题】:Mapping function to numpy array, varying a parameter映射函数到numpy数组,改变参数
【发布时间】:2011-04-28 00:21:11
【问题描述】:

首先,让我给你看一下codez:

a = array([...])
for n in range(10000):
    func_curry = functools.partial(func, y=n)
    result = array(map(func_curry, a))
    do_something_else(result)
    ...

我在这里所做的是尝试将func 应用于数组,每次更改func 的第二个参数的值。这太慢了(每次迭代都创建一个新函数肯定无济于事),我也觉得我错过了 Python 的做法。有什么建议吗?

给我一​​个二维数组的解决方案是个好主意吗?我不知道,但也许是。

可能的问题的答案:

  • 是的,这是(使用广义定义)一个优化问题(do_something_else() 隐藏了这个)
  • 不,scipy.optimize 不起作用,因为我正在处理布尔值,它似乎永远不会收敛。

【问题讨论】:

  • func 是做什么的?如果我们对它的作用有更多了解,那么我们也许可以帮助您找到更快的方法。现在,我认为 map 必须将 numpy 数组更改为列表,对其进行映射,然后将列表更改回对我来说听起来并不快的数组。如果我们能找到一种使用 numpy 函数对列执行 func 的方法,它应该会更快。我猜您正在对 a 中矩阵的每一列应用 func ,然后使用结果更接近正确的解决方案。您是否进行了分析以确保这部分是问题而不是 do_something_else 部分?

标签: python arrays map numpy currying


【解决方案1】:

你能重写函数吗?如果可能,您应该编写函数来获取两个 numpy 数组 anumpy.arange(n)。您可能需要重新整形以使数组排队以进行广播。

【讨论】:

    【解决方案2】:

    你试过numpy.vectorize吗?

    ...
        vfunc_curry = vectorize(functools.partial(func, y=n))
        result = vfunc_curry(a)
    ...
    

    【讨论】:

      【解决方案3】:

      如果a 的大小很大,那么瓶颈不应该是函数的创建,而是数组的复制。

      【讨论】:

      • a 是一个长度为 100 的一维 numpy 数组
      • 那么func 做什么?如果由于某种原因你不能透露func 做了什么,你必须自己寻找瓶颈。 Profiler 将对此有所帮助 (docs.python.org/library/profile.html)。
      猜你喜欢
      • 2011-02-15
      • 2017-07-03
      • 1970-01-01
      • 2011-06-01
      • 2014-08-25
      • 2018-08-31
      • 2015-11-13
      • 1970-01-01
      • 2020-01-25
      相关资源
      最近更新 更多