矢量化python函数
我有一个名为矢量化python函数,python,numpy,vectorization,apply,Python,Numpy,Vectorization,Apply,我有一个名为old_func的旧函数,它将两个位置参数x和y作为输入。函数的输入是这样编写的,使用元组作为输入: def old_func(position): x, y = position return x**2 + y**2 我现在想要一种通过值网格调用函数的快速简便方法: xx = numpy.linspace(0, 1, 100) yy = numpy.linspace(0, 1, 100) X, Y = numpy.meshgrid(xx, yy) array
old_func
的旧函数,它将两个位置参数x
和y
作为输入。函数的输入是这样编写的,使用元组作为输入:
def old_func(position):
x, y = position
return x**2 + y**2
我现在想要一种通过值网格调用函数的快速简便方法:
xx = numpy.linspace(0, 1, 100)
yy = numpy.linspace(0, 1, 100)
X, Y = numpy.meshgrid(xx, yy)
array_positions = (X,Y)
old_fun(array_positions)
其目的是在功能中对
x
的每个操作都在所有x
上完成,对y
也一样。我尝试使用矢量化函数,但不起作用。我不希望将函数更改为接受NumPy数组,因为这将花费太长的时间。下面的代码实现了这一点,并为您省去了创建数组位置的麻烦
首先,使用将X
和Y
展平为(10000,)
形状的NumPy数组
然后,使用以迭代方式沿这些展平数组的长度实现自定义函数
float_array = np.apply_along_axis(old_func, 0, (X_flattened, Y_flattened))
最后,将输出数组重塑为所需的(100100)
您自己的代码应该(并且确实)运行良好:
def old_fun(position):
x, y = position
z = x**2 + y**2
return z
xx = numpy.linspace(0,1,100)
yy = numpy.linspace(0,1,100)
X,Y = numpy.meshgrid(xx, yy)
array_positions = (X,Y)
Z = old_fun(array_positions)
Z.shape
现在是(100100)
通常,numpy数组将与任何标准操作符一起工作,如+
和**
。请注意,尽管您的old_fun
将一个元组作为输入,并且该元组需要由两个值组成,但这两个值的类型可以是任何类型,只要该类型支持数学运算符。标准Python标量和numpy数组都支持这些,因此代码运行良好
关于@JuanManuel答案的一点说明:尽管它也可以很好地工作,apply_沿_轴
特别不适用于矢量化,因为人们通常希望使用它,即从numpy中获得良好的性能<代码>沿_轴应用_
将导致缓慢的Python循环,而不是像正确矢量化的代码那样快速的C循环。您自己的代码使用适当的矢量化,所以请使用它。谢谢,我认为您是对的,但是由于我的old_func
函数从技术上讲是一个单元组函数,我需要np。沿_轴应用_(old_func,0,(X_展平,Y_展平))
对吗?是的,这是正确的!我相应地修改了答案。你是对的。嗯,我应该测试我的示例,以确保它确实给出了我实际函数所产生的原始错误。我将尝试编辑我的问题。
np.reshape(float_array, (100, 100))
def old_fun(position):
x, y = position
z = x**2 + y**2
return z
xx = numpy.linspace(0,1,100)
yy = numpy.linspace(0,1,100)
X,Y = numpy.meshgrid(xx, yy)
array_positions = (X,Y)
Z = old_fun(array_positions)