【发布时间】:2015-03-30 00:28:11
【问题描述】:
概述
我在使用 polyfit 时遇到了性能问题,因为它似乎无法接受广播数组。我知道from this post 如果您使用numpy.polynomial.polynomial.polyfit,则依赖数据y 可以是多维的。但是,x 维度不能是多维的。反正有这个吗?
动机
我需要计算一些数据的变化率。为了与实验相匹配,我想使用以下方法:获取数据y 和x,对于短部分数据拟合多项式,然后使用拟合系数作为变化率的估计值。
插图
import numpy as np
import matplotlib.pyplot as plt
n = 100
x = np.linspace(0, 10, n)
y = np.sin(x)
window_length = 10
ydot = [np.polyfit(x[j:j+window_length], y[j:j+window_length], 1)[0]
for j in range(n - window_length)]
x_mids = [x[j+window_length/2] for j in range(n - window_length)]
plt.plot(x, y)
plt.plot(x_mids, ydot)
plt.show()
蓝线是原始数据(正弦曲线),而绿线是一阶微分(余弦曲线)。
问题
为了矢量化,我做了以下操作:
window_length = 10
vert_idx_list = np.arange(0, len(x) - window_length, 1)
hori_idx_list = np.arange(window_length)
A, B = np.meshgrid(hori_idx_list, vert_idx_list)
idx_array = A + B
x_array = x[idx_array]
y_array = y[idx_array]
这会将两个 1D 向量广播到形状为 (n-window_length, window_length) 的 2D 向量。现在我希望polyfit 会有一个axis 参数,这样我就可以并行计算,但没有这样的运气。
有人对如何做到这一点有任何建议吗?我愿意
【问题讨论】:
-
计算一阶数值导数而不是使用 polyfit 应该更快更准确
-
@M4rtini 你是对的,但我这样做是为了与实验者使用的方法保持一致。它在问题中,但我很感激有太多的文字让任何人都被打扰阅读。
-
哦,错过了问题的那一部分。我想我的答案完全无关紧要