将函数数组应用于矩阵列的最快方法

2024-04-20 07:42:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数的数组shape(n,)和一个numpy矩阵shape(m, n)。现在我想将每个函数应用到矩阵中相应的列,即

matrix[:, i] = funcs[i](matrix[:, i])

我可以用for循环来实现这一点(参见下面的示例),但是在numpy中通常不鼓励使用for循环。我的问题是,最快(最好是最优雅)的方法是什么?在

一个有效的例子

^{pr2}$

Tags: 方法函数numpy示例for矩阵数组matrix
2条回答

对于有许多行和几列的数组,简单的列迭代应该具有时效性:

In [783]: funcs = [lambda x: x+1, lambda x: x+2, lambda x: x+3]
In [784]: arr = np.arange(12).reshape(4,3)
In [785]: for i in range(3):
     ...:     arr[:,i] = funcs[i](arr[:,i])
     ...:     
In [786]: arr
Out[786]: 
array([[ 1,  3,  5],
       [ 4,  6,  8],
       [ 7,  9, 11],
       [10, 12, 14]])

如果函数使用1d数组输入,则不需要np.vectorizenp.vectorize通常比普通迭代慢。)同样,对于这样的迭代,也不需要在数组中包装函数列表。在列表上迭代更快。在

索引迭代的变体:

^{pr2}$

我在这里使用arr.T,所以迭代在arr的列上,而不是行上。在

一般观察:在一个复杂的任务上进行几次迭代是非常好的numpy风格。简单任务上的许多迭代都很慢,应该尽可能在编译后的代码中执行。在

循环在这里是有效的,因为循环中的任务很重。在

只是一个可读的解决方案:

np.vectorize(apply)(funcs,matrix)

相关问题 更多 >