在python函数中非常基本的numpy操作

时间:2015-11-12 21:28:06

标签: python arrays numpy

我总是想在我的python代码中避免循环操作。 Numpy确实很有帮助,但在一些稍微复杂的情况下,我觉得如何明智地利用numpy数组。

下面是一个简单的例子,说明我的无能,a是一个参数,b是一个numpy数组。

def f(a,b):
    return np.sum( a * b)

因此,如果我希望通过给定的单个参数和数组来评估此函数,则没有问题。

x = 2
y = np.arange(3)
print (f(x,y))

但有时我想用固定的数组值来评估函数的不同参数值。

我会尝试:

x2 = np.array([1,4,5,2,8])
print (f(x2,y))

我希望得到的肯定是一个有价值的数组:

[f(1,y),f(4,y),f(5,y),f(2,y),f(8,y)]

然而,python将尝试评估x和y的点积,因为现在它们都是np数组并且它将报告

ValueError: operands could not be broadcast together with shapes (5,) (3,)

我应该如何以阵容方式的方式克服这个问题,产生序列

[f(1,y),f(4,y),f(5,y),f(2,y),f(8,y)] 

不使用循环?

(在这个例子中,我可以通过修改f来解决问题:

def f(a,b):
    return a * np.sum(b)

但在大多数情况下,我们无法将参数排除在外。)

1 个答案:

答案 0 :(得分:2)

对于这样的案例,

np.newaxis是一个非常方便的工具,可以让您对广播有更多的控制权。在这种情况下,您将要添加一个新轴,以便给出关于广播位置的一些提示:

>>> x = np.array([1,4,5,2,8])
>>> y = np.arange(3)
>>> x[:,np.newaxis] * y
array([[ 0,  1,  2],
       [ 0,  4,  8],
       [ 0,  5, 10],
       [ 0,  2,  4],
       [ 0,  8, 16]])

如果你喜欢沿第二轴的总和,你可以这样求:

>>> (x[:, np.newaxis] * y).sum(axis=1)
array([ 3, 12, 15,  6, 24])