Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的自动数组演算(numpy)_Python_Numpy_Array Broadcasting - Fatal编程技术网

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是数组时。它不能自动检测所有这些组合吗?结果不是一维数组吗?我需要它是多维的(如果一个数组中有多个输入)。当
时,
是什么?谷歌没有帮助。这是来自软件包峰值规则:。它用于生成泛型函数等。