向量化数组的行

Posted

技术标签:

【中文标题】向量化数组的行【英文标题】: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

【问题讨论】:

【参考方案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 循环,设置结果的类型和大小可能有助于加快处理速度。

【讨论】:

以上是关于向量化数组的行的主要内容,如果未能解决你的问题,请参考以下文章

向量化

如何确定向量长度以确保向量化过程中没有向量依赖性?

向量化计算numpy中一组点的所有单位向量

英特尔 Fortran 向量化:向量循环成本高于标量

为啥在一定数量的元素之后循环不向量化?

如何使用向量化代码从 MATLAB 中的两个向量生成所有对?