我总是想在我的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)
但在大多数情况下,我们无法将参数排除在外。)
答案 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])