python中的自动数组演算(numpy)
我有一个依赖于几个变量的函数,比如说python中的自动数组演算(numpy),python,numpy,array-broadcasting,Python,Numpy,Array Broadcasting,我有一个依赖于几个变量的函数,比如说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.28
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读者尽可能清楚?正确的方法是传入正确形状的数据。如果需要二维结果,则应传入二维数组。这可以通过
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),你可以考虑使用@when来适当地定义函数
例如:
# Case for single values
@when(int, int, int, int)
def f(x1,x2,x3,x4):
y = x1*x2/(x3+x4)
return y
# Case for 1D arrays
@when(list, list, list, list)
def f(x1,x2,x3,x4):
y = []
for i in range(len(x1)):
y.append(x1[i]*x2[i]/(x3[i]+x4[i]))
return y
我理解。请给我一个所有变量都是数组的例子。那我得补充一句。。。每个有多少个新轴?谢谢形状(5,7)或(7,5)是可以的,只要我能理解规则(我还没有理解:o)。@Amenhotep——看看解释规则的numpy's。总之,如果x
是一个具有形状(6,)
的一维数组,那么x[:,np.newaxis]
将给出一个形状(6,1)
数组,而x[np.newaxis,:]
将给出一个形状(1,6)
数组。现在,当你对一个(5,1)
和(1,7)
进行算术运算时,结果是一个(5,7)
,等等。是的,我理解了这部分。你能举一个三个变量为数组的例子吗?谢谢。x[:,np.newaxis,np.newaxis]+y[np.newaxis,:,np.newaxis]+z[np.newaxis,np.newaxis,:]
是一个例子,其中x
,y
和z
都是一维数组。很有趣。但是如果我想涵盖所有的案例,我需要写很多@when's,对吗?例如,当x1和x3是数字,x2和x4是数组时。它不能自动检测所有这些组合吗?结果不是一维数组吗?我需要它是多维的(如果一个数组中有多个输入)。当
时,是什么?谷歌没有帮助。这是来自软件包峰值规则:。它用于生成泛型函数等。