假设我有两个一维数组,a和b,长度为n + 1和m + 1.
我希望c是一个与b相同长度的数组,其元素等于所有元素与幂b之和的正弦值。写在下面的伪代码中。
c = sum(sine(a[0:n] ** b[0])), sum(sine(a[0:n] ** b[1])),
... sum(sine(a[0:n] ** b[m])))
有没有办法可以在不使用循环的情况下完成此任务?
(在编程方面缺乏经验,希望我的问题有道理。)
这是一个功能:
def function(a, b):
c = np.sum(np.sin(a ** b))
return c
答案 0 :(得分:2)
您可以使用numpy广播对其进行矢量化:
np.sin(np.sum(a ** b[:,None], axis=1))
import numpy as np
a = np.arange(4)
b = np.arange(3)
np.sin(np.sum(a ** b[:,None], axis=1))
#array([-0.7568025 , -0.2794155 , 0.99060736])
np.sin(np.sum(a ** b[0]))
#-0.7568024953079282
np.sin(np.sum(a ** b[1]))
#-0.27941549819892586
答案 1 :(得分:1)
如果要对正弦求和,可以先使用以下方法构造 m×n - 矩阵:
a.reshape(-1,1) ** b
接下来,我们可以使用sin
计算所有这些权力的np.sin(..)
:
np.sin(a.reshape(-1,1) ** b)
如果我们现在要总结这些sin
,我们可以在第一个轴上使用np.sum(..)
:
np.sum(np.sin(a.reshape(-1,1) ** b),axis=0)
如果我们获得a = [0,1,...,9]
和b = [0,1]
:
>>> a = np.arange(10)
>>> b = np.arange(2)
>>> np.sum(np.sin(a.reshape(-1,1) ** b),axis=0)
array([ 8.41470985, 1.95520948])
从sin(0**0)+sin(1**0)+sin(2**0)+...+sin(9**0) = 10*sin(1) = 10*0.8414709848078965
开始,第一个值是正确的。对于第二个,这等于sin(0**1)+sin(1**1)+sin(2**1)+...+sin(9**1) = sin(0)+sin(1)+...+sin(8)+sin(9)
。这是 - 根据WolframAlpha确实1.95520
。