【问题标题】:Vectorize over the rows of an array向量化数组的行
【发布时间】:2011-08-21 22:27:30
【问题描述】:

我有一个数组 X,我想将函数 f 应用于 X 的所有行:

# silly example
X = numpy.array([[1, 2, 3, 4, 5],
                 [6, 7, 8, 9, 0]], 'i')

def f(row): return sum(row)

y = numpy.vectorize(f, 'i')(rows(X))

现在,y 应该是 array([15,30], 'i')。哪种方法或切片魔法会以最有效的方式实现rows

【问题讨论】:

    标签: python numpy vectorization


    【解决方案1】:

    NumPy 实现了“特定轴上的动作”的概念。通用函数为numpy.apply_along_axis()

    >>> numpy.apply_along_axis(sum, 1, X)
    array([15, 30])
    

    sum 当然可以用任何东西代替)。

    【讨论】:

    • 对不起,我真的不想要总和,这只是“愚蠢的例子”的一部分。
    • 我认为“#silly example”行意味着OP正在寻找通用解决方案
    • @larsmans 和 JoshAdel:是的,我在您编写 cmets 时添加了一般情况。 :)
    • 代替sum的东西,是不是一定要返回一个标量?
    • @David:该函数可以返回一个列表,例如;在这种情况下,结果是一个具有正确形状的完整 NumPy 数组。
    【解决方案2】:

    它必须是 numpy 提供的东西吗?因为我只看到了一个列表理解

    [action_to_apply(row) for row in X]
    

    【讨论】:

    • 这和我现在的很相似。我希望将循环推到 C 级别。
    【解决方案3】:

    这是另一个镜头,它考虑了结果的类型和大小:

    numpy.fromiter((your_func(row) for row in X), dtype=bool, count=len(X))
    

    即使循环不是 C 循环,设置结果的类型和大小可能有助于加快处理速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      • 2021-08-02
      • 2015-08-10
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多