python - 使用 numpy 广播计算系列的部分总和
问题描述
我必须计算以下总和,S
定义为:
我尝试了以下功能:
import numpy as np
a = np.array([0.4,2.6,3, 1.2, 3.4])
b = np.array([-5,7,2,1.1,1.8])
c = np.array([3.3,30,15,0.4,28])
t = np.linspace(0, np.pi, 600)
def S(t):
return np.sum([a[i]*np.cos(b[i]*t + c[i]) for i in range(5)], axis=0)
这工作得很好。但我想知道是否有纯 numpy 版本使用广播而不依赖 Python 的列表理解?
我努力了:
def S(t):
return np.sum(a*np.cos(b*t + c), axis=0)
当我计算时,S(t)
我收到以下错误:
...
ValueError: operands could not be broadcast together with shapes (5,) (600,)
我怎样才能让它正常工作?
解决方案
a
我想我通过向、b
和数组添加一个 newaxis 找到了答案,c
如下所示:
def S(t):
return np.sum(a[:,None]*cos(b[:,None]*t + c[:,None]), axis=0)
或者
def S(t):
return np.sum(a[:,np.newaxis]*cos(b[:,np.newaxis]*t + c[:,np.newaxis]), axis=0)
编辑:
正如迈克尔在评论中所建议的那样,更好的解决方案是添加一个 newaxis 来t
代替(请注意,在这种情况下,总和是在 上执行的axis=1
):
def S(t):
return np.sum(a*cos(b*t[:,None] + c), axis=1)
推荐阅读
- php - PHP FPDF 分页符
- java - 序列化列表
转 JSON - python - 如果 MSSQL 查询为空白,如何删除空白表?
- c - Conversion of hexadecimal string constant to decimal value using C
- javascript - Why is each column in a different row?
- javascript - How to set variable before (debounced) method function in Vue?
- google-cloud-firestore - Firestore 规则:只允许将新键附加到映射字段
- r - 使用 read.xlsx 将“NULL”/“EMPTY”分配给 R 中的空白单元格而不是 NA
- if-statement - If-Statement in Google Sheets
- regex - Ruby regex to replace character sequence