【问题标题】:Better way to vectorize using numpy使用 numpy 进行矢量化的更好方法
【发布时间】:2014-12-16 10:44:02
【问题描述】:

我想知道是否有更好的方法来矢量化以下内容:

array = []
for ele in long_list:
    if condition:
        array.append(1)
vector = np.array(array)

现在这基本上是np.ones(len(long_list)),除了if 条件。

有没有更好的(矢量化)方法来实现上述目标?

【问题讨论】:

  • 什么是condition?它是针对ele 还是完全不相关的东西进行测试?
  • @Ffisegydd:类似于 if ele.type == some_type
  • 条件是否总是具有相同的值?
  • 这是否意味着数组由 1 组成,长度等于多少个 true?
  • @Joel:是的……没错……

标签: python arrays numpy vectorization


【解决方案1】:

正如您在问题中所建议的那样,如果您一次评估整个数组的条件(使用矢量化 NumPy 操作)而不是在循环中单独检查每个元素,您将获得更好的性能。

使用矢量化操作来检查条件会创建一个布尔数组,您可以对其进行压缩和转换以产生所需的输出。

为了说明这一点,下面是一个检查数组元素是否小于 10 的示例:

>>> long_list = np.arange(500)
>>> b = long_list < 10
>>> np.compress(b, b).astype(int)
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

【讨论】:

    【解决方案2】:
    vector = np.fromiter((1 for ele in long_list if condition), dtype=int)
    

    这应该比任何一个都快:

    vector = np.ones(len([x for x in long_list if conditon]))
    

    vector = np.array( [1 for ele in long_list if condition(ele)] )
    

    因为它避免了构建过滤列表,因为(1 for ele in long_list if condition) 返回的是生成器而不是列表。

    编辑

    我想知道这是否也是一个可行的选择:

    vector = np.array( (1 for ele in long_list if condition(ele)) )
    

    【讨论】:

    • 第一个不起作用,它要求 dtype.. vector = np.fromiter((1 for ele in [1,2,3]) ,dtype=int) 有效 :) 但谢谢.
    【解决方案3】:

    列表推导比for 循环更快。我假设条件取决于ele

    array = [1 for ele in long_list if condition(ele)]
    
    vector = np.array(array)
    

    另一种选择是使用更快的方法来计算condition(ele)True 的情况。但我所知道的可能做到这一点的技巧通常取决于条件是什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多