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

Python Numpy将函数数组应用于矩阵列的最快方法,python,numpy,Python,Numpy,我有一个函数数组shape(n,)和一个numpy矩阵shape(m,n)。现在我想将每个函数应用到矩阵中对应的列,即 matrix[:, i] = funcs[i](matrix[:, i]) 我可以使用for循环来实现这一点(参见下面的示例),但在numpy中通常不鼓励使用for循环。我的问题是,最快(最好是最优雅)的方法是什么 一个有效的例子 对于具有多行和几列的数组,简单的列迭代应具有时效性: In [783]: funcs = [lambda x: x+1, lambda x: x+

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

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

一个有效的例子
对于具有多行和几列的数组,简单的列迭代应具有时效性:

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.vectorize
np.vectorize
通常比普通迭代慢。)同样,对于这样的迭代,也不需要将函数列表包装在数组中。在列表上迭代会更快

索引迭代的一个变体:

In [787]: for f, col in zip(funcs, arr.T):
     ...:     col[:] = f(col)
     ...:     
In [788]: arr
Out[788]: 
array([[ 2,  5,  8],
       [ 5,  8, 11],
       [ 8, 11, 14],
       [11, 14, 17]])
我在这里使用
arr.T
,因此迭代在
arr
的列上,而不是行上


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

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

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

np.vectorize(apply)(funcs,matrix)

您可以共享您正在使用的实际函数吗?当您反复执行相同的操作时,不鼓励循环,但是当您在不同的Python函数上循环时,可能无法使其更快。
funcs=np.array([np.vectorize(lambda x:x+1),…
看起来您已经偏离了方向。最好退一步,看看您实际要解决的问题。@Divakar,我使用的函数是基于,但对于特定的任务略有不同。我认为对于我这里的问题来说,解释它会变得太复杂。@roganjosh愿意解释吗?这个与纯Python中的功能非常接近,即函数列表。感谢您的解决方案,您知道Python 3.x中是否有与
apply
等效的功能?
np.vectorize(apply)(funcs,matrix)