Python Numpy将函数数组应用于矩阵列的最快方法
我有一个函数数组shapePython 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+
(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)