2016-07-26 155 views
1

说我有一个函数foo(),它接受一个浮点数并返回一个浮点数。将此函数应用于numpy矩阵或数组中的每个元素的最快/最蟒蛇方法是什么?如何对numpy矩阵中的每个元素执行操作?

我本质上需要的是这个代码的版本,不使用循环:

import numpy as np 

big_matrix = np.matrix(np.ones((1000, 1000))) 

for i in xrange(np.shape(big_matrix)[0]): 

    for j in xrange(np.shape(big_matrix)[1]): 

     big_matrix[i, j] = foo(big_matrix[i, j]) 

我试图找到numpy的文档中的东西,让我做到这一点,但我的天堂”什么都没发现。

编辑:正如我在评论中所提到的,特别是我需要使用的功能是双曲线函数,f(z) = 1/(1 + exp(-z))

+0

同意矢量化是答案。您将需要重新考虑foo()所做的功能,目前它适用于单个元素。矢量化意味着一次对整个行/列进行操作,从而消除循环。 –

+1

'np.vectorize'绝对是一般情况下最“pythonic”的。然而,对于某些函数'foo',通过完全不使用函数并依赖'numpy'向量操作,你可能会做得更好(因为'np.vectorize'实际上没有做任何事情来使得计算更高性能)。 – mgilson

+0

我专门希望使用S形函数,即'F(z)的= 1 /(1 + EXP(-z))' –

回答

3

如果foo确实是一个黑盒子,需要一个标量,并返回一个标量,那么你必须使用某种形式的迭代。人们经常尝试np.vectorize,并认识到,正如文件所述,它不会加快速度。作为广播多个输入的方式,它是最有价值的。它使用np.frompyfunc,它稍微快一点,但有一个不太方便的界面。

正确numpy的办法是改变你的功能,所以它与阵列工作。这应该不难与您的意见功能

f(z) = 1/(1 + exp(-z)) 

有一个np.exp函数。其余的都是简单的数学。

+0

接受,因为它回答我的实际问题。我改变了我的问题来反映这一点。 –

相关问题