Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何对numpy矩阵中的每个元素执行操作?_Python_Arrays_Numpy_Matrix - Fatal编程技术网

Python 如何对numpy矩阵中的每个元素执行操作?

Python 如何对numpy矩阵中的每个元素执行操作?,python,arrays,numpy,matrix,Python,Arrays,Numpy,Matrix,假设我有一个函数foo(),它接受一个浮点数并返回一个浮点数。将此函数应用于numpy矩阵或数组中的每个元素的最快/最具python风格的方法是什么 我本质上需要的是一个不使用循环的代码版本: 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]

假设我有一个函数foo(),它接受一个浮点数并返回一个浮点数。将此函数应用于numpy矩阵或数组中的每个元素的最快/最具python风格的方法是什么

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

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文档中找到一些允许我这样做的东西,但我没有找到任何东西


编辑:正如我在评论中提到的,特别是我需要使用的函数是sigmoid函数,
f(z)=1/(1+exp(-z))
如果
foo
实际上是一个接受标量并返回标量的黑盒,那么必须使用某种迭代。人们经常尝试将np.vectorize矢量化,并意识到,如文献所述,它并不能大大加快速度。作为一种广播多个输入的方式,它最有价值。它使用
np.frompyfunc
,速度稍快,但界面不太方便

正确的numpy方法是更改函数,使其与数组一起工作。这对于你评论中的函数应该不难做到

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

有一个
np.exp
函数。剩下的是简单的数学

同意矢量化是答案。您需要重新思考函数foo()的作用,目前它在单个元素上工作。矢量化意味着一次对整个行/列进行操作,从而消除循环。
np.vectorize
在一般情况下肯定是最“pythonic”的。但是,对于某些函数
foo
,如果完全不使用函数并依赖
numpy
向量运算,您可能会做得更好(因为
np.vectorize
实际上并没有做任何事情来提高计算的性能)。我特别希望使用sigmoid函数,即
f(z)=1/(1+exp(-z))
exp(-z)
替换为
np.exp(-z)
你的函数将被矢量化。然后它可以接受一个np.array作为输入,并返回正确的答案。这不是一个好的副本。它所建议的是
np.vectorize
哪些循环。注释中有更好的答案。接受它是因为它回答了我的实际问题。我已经改变了我的问题以反映这一点。