Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.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:如何重写与数组一起使用的函数?_Python_Arrays_Numpy - Fatal编程技术网

Python:如何重写与数组一起使用的函数?

Python:如何重写与数组一起使用的函数?,python,arrays,numpy,Python,Arrays,Numpy,我有一个简单的函数,如下所示: def summer_scalar(x): a = np.array([1,2,3]) b = np.array([7,8,9]) return sum(a - b * x) 它可以工作,但是如果我想将它用于数组,例如Numpy数组,就会出现问题。如果我提交numpy数组,则会出现错误: summer_scalar(np.array([7,8,9,7])) ValueError: operands could not be broadca

我有一个简单的函数,如下所示:

def summer_scalar(x):
    a = np.array([1,2,3])
    b = np.array([7,8,9])
    return sum(a - b * x)
它可以工作,但是如果我想将它用于数组,例如Numpy数组,就会出现问题。如果我提交numpy数组,则会出现错误:

summer_scalar(np.array([7,8,9,7]))
ValueError: operands could not be broadcast together with shapes (3,) (4,) 
我猜原因是它将我的所有数组都视为对等数组,但它们不是:来自参数的元素应该一个接一个地处理,并形成一个输出数组,来自a和b的参数应该像以前一样处理。因此,它尝试对不同大小的数组求和,但失败了

我能做什么

我可以重写我的方法:

def summer(x):
    a = np.array([1,2,3])
    b = np.array([7,8,9])
    s = 0
    for ai,bi in zip(a,b):
        s = s + ai - bi* x 
        #print ai,bi,s
    return s
这很有效


问题是:有没有更好的方法来修改我的向量运算方法?

是的,有更好的方法

方法1

将所述问题直接转化为矢量化的思维方式会导致我们利用杠杆,就像这样-

(a-b*x[:,None]).sum(1)
a.sum(0) - np.einsum('i,j->i', x,b)
这是一个外部产品,所以我们也可以使用NumPy ufunc来做同样的事情-

(a-np.multiply.outer(x,b)).sum(1)
方法2

仔细看,我们似乎不需要显式的维度扩展+广播,我们可以将a和b中的元素相加,然后做类似的事情-

a.sum(0) - x*b.sum(0)
我们可以用这里来代替x*b.sum0,就像这样-

(a-b*x[:,None]).sum(1)
a.sum(0) - np.einsum('i,j->i', x,b)
同样,a.sum0可以被另一个einsum替代-

所以,有很多选项可以矢量化这样的操作