【发布时间】:2016-11-30 13:21:42
【问题描述】:
假设我有一个函数 foo(),它接受一个浮点数并返回一个浮点数。将此函数应用于 numpy 矩阵或数组中的每个元素的最快/最 Pythonic 的方法是什么?
我本质上需要的是不使用循环的代码版本:
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 文档中找到允许我执行此操作的内容,但我没有找到任何内容。
编辑:正如我在 cmets 中提到的,特别是我需要使用的函数是 sigmoid 函数,f(z) = 1 / (1 + exp(-z))。
【问题讨论】:
-
同意矢量化是答案。您将需要重新考虑函数 foo() 的作用,目前它适用于单个元素。矢量化意味着一次对整个行/列进行操作,从而消除循环。
-
np.vectorize在一般情况下绝对是最“pythonic”的。但是,对于某些函数foo,您可能可以通过完全不使用函数并依赖numpy向量运算来做得更好(因为np.vectorize并没有真正做任何事情来提高计算性能)。 -
我特别想使用 sigmoid 函数,即
f(z) = 1 / (1 + exp(-z)) -
用
np.exp(-z)替换exp(-z),你的函数将被向量化。然后它可以将 np.array 作为输入并返回正确的答案。 -
stackoverflow.com/questions/7701429/… 不是很好的副本。它提出的只是循环的
np.vectorize。 cmets中有更好的答案。
标签: python arrays numpy matrix