向量化数组的行
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 循环,设置结果的类型和大小可能有助于加快处理速度。
【讨论】:
以上是关于向量化数组的行的主要内容,如果未能解决你的问题,请参考以下文章