【问题标题】:NumPy : applying a function that takes a list as a argument to a list of list, and get a listNumPy:将一个以列表作为参数的函数应用到列表列表,并获取列表
【发布时间】:2020-10-08 07:22:16
【问题描述】:

我有一个问题,阅读文档没有帮助。 好的,基本上,我有一些函数将 NumPy 列表作为参数,并返回一个数字。 (例如,与np.average 相同)。我们称这个函数为f

现在,我有一个列表列表L。所以,L[0] 是一个列表,L[1] 是一个列表... 而且,我想使用 NumPy 并行性将 f 应用于 L 并得到结果[f(L[0]), f(L[1]),...]。 我的问题来了:当我打电话给f(L)时,结果是一个数字,这个数字是f(flattened L)

我不知道如何解决这个问题,有人可以帮助我吗?

谢谢, Kal8578

【问题讨论】:

  • f 是 numpy 函数,还是你自己的自定义函数?
  • 这是我自己的自定义函数,它接受一个 numpy 列表作为参数,使用 np.average 计算其平均值,如果该平均值与给定常数之间的距离大于另一个给定常数,则返回 1持续的。代码为:def dist_moy_reel(L): return(np.abs(np.average(L)-x)>=d)
  • numpy 的速度来自于将已编译的 numpy 函数应用于 numoy 数组。 Python 级别的迭代,无论是在数组还是列表(列表)上都比较慢。

标签: python list numpy numpy-ndarray


【解决方案1】:

f 转换为递归函数怎么样? 比如:

def f(x):
    if isinstance(x, list):
        return [f(y) for y in x]
    # return what you previously wrote here

【讨论】:

  • 我认为这行得通,但问题是它不再使用 NumPy 并行性了。我的意思是,例如,如果我想将cos 应用于给定列表L,则使用for 成本O(len(L)),而np.cos(np.array(L)) 成本O(1)。因此,我想使用该属性来避免使用for/递归/map 的任何东西,因此会花费O(len(L)) 或更多。
  • np.cos 不是 O(1),它只是更快,因为迭代是在编译后的代码中完成的。在简单的 c 数组上迭代的自定义 c 代码将同样快。
  • 哦,那我错了。谢谢,这是一个 Uni 项目,我们特别强调的教训是 np.something(np.somearray) 很快
猜你喜欢
  • 2020-07-24
  • 2018-12-19
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 2021-04-25
  • 2014-05-16
相关资源
最近更新 更多