2024-04-20 07:42:43 发布
网友
我有一个函数的数组shape(n,)和一个numpy矩阵shape(m, n)。现在我想将每个函数应用到矩阵中相应的列,即
(n,)
(m, n)
matrix[:, i] = funcs[i](matrix[:, i])
我可以用for循环来实现这一点(参见下面的示例),但是在numpy中通常不鼓励使用for循环。我的问题是,最快(最好是最优雅)的方法是什么?在
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通常比普通迭代慢。)同样,对于这样的迭代,也不需要在数组中包装函数列表。在列表上迭代更快。在
np.vectorize
索引迭代的变体:
我在这里使用arr.T,所以迭代在arr的列上,而不是行上。在
arr.T
arr
一般观察:在一个复杂的任务上进行几次迭代是非常好的numpy风格。简单任务上的许多迭代都很慢,应该尽可能在编译后的代码中执行。在
numpy
循环在这里是有效的,因为循环中的任务很重。在
只是一个可读的解决方案:
np.vectorize(apply)(funcs,matrix)
对于有许多行和几列的数组,简单的列迭代应该具有时效性:
如果函数使用1d数组输入,则不需要
np.vectorize
(np.vectorize
通常比普通迭代慢。)同样,对于这样的迭代,也不需要在数组中包装函数列表。在列表上迭代更快。在索引迭代的变体:
^{pr2}$我在这里使用
arr.T
,所以迭代在arr
的列上,而不是行上。在一般观察:在一个复杂的任务上进行几次迭代是非常好的
numpy
风格。简单任务上的许多迭代都很慢,应该尽可能在编译后的代码中执行。在循环在这里是有效的,因为循环中的任务很重。在
只是一个可读的解决方案:
相关问题 更多 >
编程相关推荐