python中的自动数组微积分(numpy)
作者:互联网
我有一个依赖于几个变量的函数,假设y = f(x1,x2,x3,x4).如果每个变量都是一个简单的数字,那么结果应该是一个普通的数字.如果其中一个变量是一个数组,我需要结果也是一个数组.依此类推:如果其中两个变量是数组,我需要将结果作为一个二维数组.等等.
例:
def f(x1,x2,x3,x4):
y=x1*x2/(x3+x4)
return y
x1=1.0
x2=2.0
x3=3.0
x4=4.0
f(x1,x2,x3,x4)
# should give 2.0/7.0 = 0.2857...
x3=array([1.0,2.0,3.0,4.0,5.0])
f(x1,x2,x3,x4)
# should give a one-dimensional array with shape (5,)
x4=array([10.0,20.0,30.0,40.0,50.0,60.0,70.0])
f(x1,x2,x3,x4)
# should give a two-dimensional array with shape (5,7)
怎么做? (为了我的程序的非Python读者,尽可能清楚?)
解决方法:
正确的方法是传递正确形状的数据.如果你想要一个2d的结果,你应该传入2d数组.这可以通过np.newaxis来完成.
import numpy as np
def f(x1,x2,x3,x4):
y = x1*x2/(x3+x4)
return y
x1 = 1.0
x2 = 2.0
x3 = 3.0
x4 = 4.0
print f(x1,x2,x3,x4)
x3 = np.array([1.0,2.0,3.0,4.0,5.0])
print f(x1,x2,x3,x4)
x3 = x3[:, np.newaxis]
x4 = np.array([10.0,20.0,30.0,40.0,50.0,60.0,70.0])
x4 = x4[np.newaxis, :]
print f(x1,x2,x3,x4)
当然,你提出问题的方式,为什么你应该期望得到一个数组形状(5,7)而不是数组形状(7,5)有点模棱两可.
标签:python,numpy,numpy-broadcasting 来源: https://codeday.me/bug/20190703/1366615.html