【问题标题】:Numpy vectorize function to operate on rows用于对行进行操作的 Numpy 矢量化函数
【发布时间】:2017-08-08 04:36:15
【问题描述】:

假设我想按如下方式对函数f 进行矢量化,以便将其逐行应用于矩阵:

f_vec = np.vectorize(
     f,
     signature = '(m,n)->m'
)

f_vec 应该将f 应用于输入矩阵的每一行并返回结果向量。但是,我收到一个错误:

ValueError: not a valid gufunc signature: (m,n)->m

我做错了什么?

【问题讨论】:

  • 请记住,“[t]he vectorize 函数的提供主要是为了方便,而不是为了性能。实现本质上是一个 for 循环。”
  • np.vectorize 代码是可读的 Python。对于这样的签名,它使用ndindex 迭代维度m,将大小为n 的数组传递给您的函数,期望返回一个值。 np.array([f(row) for row in arr]) 应该一样快或更快(开销更少)。

标签: python python-3.x numpy vectorization array-broadcasting


【解决方案1】:

我使用(m,n)->(m) 作为签名是因为我认为signature 应该是vectorized 函数的签名。但是,它实际上应该是pyfunc 的签名!所以在我的例子中,签名将是(n)->() 用于f,产生(m,n)->(m) 用于f_vec。换句话说,这段代码有效:

f_vec = np.vectorize(f, signature='(n)->()')

这表示f 将向量转换为标量,这意味着f_vec 将矩阵转换为向量。

【讨论】:

  • 只是为了帮助未来的读者——使用你的命名法,我认为你的签名应该是(n)->(),而不是(m)->()。它仍然有效,因为 numpy 只想要那里的任何字母,但为了符合您的解释,正在消除的是维度 n
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
相关资源
最近更新 更多