numpy数组和函数

时间:2017-09-26 14:59:12

标签: python arrays numpy sum

假设我有两个一维数组,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

2 个答案:

答案 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