【问题标题】:How to perform an operation on every element in a numpy matrix?如何对numpy矩阵中的每个元素执行操作?
【发布时间】: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


【解决方案1】:

如果foo 真的是一个接受标量并返回标量的黑盒,那么您必须使用某种迭代。人们经常尝试np.vectorize 并意识到,正如记录的那样,它并没有加快速度。作为广播多个输入的一种方式,它是最有价值的。它使用np.frompyfunc,速度稍快,但界面不太方便。

正确的 numpy 方法是更改​​您的函数,使其适用于数组。这对你的 cmets 中的函数应该不难

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

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

【讨论】:

  • 接受,因为它回答了我的实际问题。我已更改我的问题以反映这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多