【问题标题】:How can I vectorize a function to two take as arguments two sequences of different lengths (m and n) and return a matrix (m x n) in Python NumPy?如何将一个函数向量化为两个,将两个不同长度的序列(m 和 n)作为参数,并在 Python NumPy 中返回一个矩阵(m x n)?
【发布时间】:2020-06-18 11:38:16
【问题描述】:

我必须序列(例如)和一个函数:

import numpy as np

a = np.arange(10,21)
b = np.arange(10,16)

def f(x,y):
    return x**2+y*3

我想构造一个矩阵(10x5),这样它的每个元素都将是这些元素上的函数迭代的结果。因此,例如,矩阵的 2nd 行和 3rd 列的元素将是:

matrix[1,2]
>>> 157

即f(11,12) = 11**2 + 12*3 = 121 + 36 = 157。

我尝试使用嵌套循环(两个“for”循环),但它太慢了。 numpy 有没有办法一次执行操作,例如一个 np 函数,它以 abf 作为参数并返回所需的结果?

非常感谢:)

【问题讨论】:

  • def f(x,y): return x[:,None]**2+y*3?
  • 如果 x 是 (m,1) 数组,y 是 (n,) 形状,则加法和乘法等操作将创建 (m,n) 数组。 (n,) 自动扩展为 (1,n)。这称为broadcasting
  • 您不想要一个 11x6 矩阵吗?或者也许改变你的 arange() 的界限

标签: python numpy iteration vectorization


【解决方案1】:

你可以把a 变成一个列向量然后瞧:

matrix = a[:,np.newaxis] ** 2 + b * 3

虽然这样的东西更干净:

a, b = np.ogrid[10:21,10:16]
matrix = a ** 2 + b * 3

(感谢 hpaulj 的评论编辑)

【讨论】:

  • a[:,None] 可能是将 (m,) 形状转换为 (m,1) 的最常见和惯用的方式。它(和reshape)生成viewnp.c_ 复制一份。
  • 好点!我也看过np.expand_dims,这也是一个不错的选择吗?
猜你喜欢
  • 1970-01-01
  • 2014-12-24
  • 2012-03-25
  • 2019-08-08
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
相关资源
最近更新 更多