我再次使用Python,我找到了一本带有例子的简洁书.其中一个例子是绘制一些数据.我有一个包含两列的.txt文件,我有数据.我把数据绘制得很好,但是在练习中它说:进一步修改程序以计算和绘制数据的运行平均值,定义如下:
$Y_k=\frac{1}{2r}\sum_{m=-r}^r y_{k+m}$
Run Code Online (Sandbox Code Playgroud)
其中r=5在此情况下(以及y_k在数据文件中的第二列).让程序在同一图表上绘制原始数据和运行平均值.
到目前为止我有这个:
from pylab import plot, ylim, xlim, show, xlabel, ylabel
from numpy import linspace, loadtxt
data = loadtxt("sunspots.txt", float)
r=5.0
x = data[:,0]
y = data[:,1]
plot(x,y)
xlim(0,1000)
xlabel("Months since Jan 1749.")
ylabel("No. of Sun spots")
show()
Run Code Online (Sandbox Code Playgroud)
那么如何计算总和呢?在Mathematica中它很简单,因为它是符号操作(例如Sum [i,{i,0,10}]),但是如何计算python中的sum,它取数据中的每十个点并对其进行平均,直到结束分数?
我看了看这本书,却发现没有什么可以解释这个:
heltonbiker的代码诀窍^^:D
from __future__ import division
from pylab import plot, ylim, xlim, show, xlabel, ylabel, grid
from numpy import linspace, loadtxt, ones, convolve
import numpy as numpy
data = loadtxt("sunspots.txt", float)
def movingaverage(interval, …Run Code Online (Sandbox Code Playgroud) 我正在做:
import librosa
D = librosa.stft(samples, n_fft=nperseg,
hop_length=overlap, win_length=nperseg,
window=scipy.signal.windows.hamming)
spect, _ = librosa.magphase(D)
audio_signal = librosa.griffinlim(spect, n_iter=1024,
win_length=nperseg, hop_length=overlap,
window=signal.windows.hamming)
print(audio_signal, audio_signal.shape)
sf.write('test.wav', audio_signal, sample_rate)
Run Code Online (Sandbox Code Playgroud)
并且它在重建的音频信号中引入了明显的失真。我能做些什么来改善它?
我有一个熵曲线(1d numpy数组),但这条曲线有很多噪音.我想用平滑删除噪音.
这是我的曲线图:

我试图解决这个问题,使用Kaiser-Bessel过滤器制作卷积产品:
gaussian_curve = window_kaiser(windowLength, beta=20) # kaiser filter
gaussian_curve = gaussian_curve / sum(gaussian_curve)
for i in range(0, windows_number):
start = (i * step) + 1
end = (i * step) + windowLength
convolution[i] = (np.convolve(entropy[start:end + 1], gaussian_curve, mode='valid'))
entropy[i] = convolution[i][0]
Run Code Online (Sandbox Code Playgroud)
但此代码返回此错误:
File "/usr/lib/python2.7/dist-packages/numpy/core/numeric.py", line 822, in convolve
raise ValueError('v cannot be empty')
ValueError: v cannot be empty
Run Code Online (Sandbox Code Playgroud)
具有'valid'模式的numpy.convolve运算符返回重叠中的中心元素,但在这种情况下,返回一个空元素.
是否有一种简单的方法来应用平滑?
谢谢!
我有一个我想要平滑的数据集.我有两个不均匀间隔的变量y和x.y是因变量.但是,我不知道x与y有什么关系.
我读了所有关于插值的内容,但插值要求我知道将x与y相关的公式.我还查看了其他平滑函数,但这些函数会导致起点和终点出现问题.
有谁知道如何: - 获得一个将x与y相关联的公式 - 平滑数据点而不会弄乱端点
我的数据如下:
import matplotlib.pyplot as plt
x = [0.0, 2.4343476531707129, 3.606959459205791, 3.9619355597454664, 4.3503348239356558, 4.6651002761894667, 4.9360228447915109, 5.1839565805565826, 5.5418099660513596, 5.7321342976055165,5.9841050994671106, 6.0478709402949216, 6.3525180590674513, 6.5181245134579893, 6.6627517592933767, 6.9217136972938444,7.103121623408132, 7.2477706136047413, 7.4502723880766748, 7.6174503055171137, 7.7451599936721376, 7.9813193157205191, 8.115292520850506,8.3312689109403202, 8.5648187916197998, 8.6728478860287623, 8.9629327234023926, 8.9974662723308612, 9.1532523634107257, 9.369326186780814, 9.5143785756455479, 9.5732694726297893, 9.8274813411538613, 10.088572892445802, 10.097305715988142, 10.229215999264703, 10.408589988296546, 10.525354763219688, 10.574678982757082, 10.885039893236041, 11.076574204171795, 11.091570626351352, 11.223859812944436, 11.391634940142225, 11.747328449715521, 11.799186895037078, 11.947711314893802, 12.240901223703657, 12.50151825769724, 12.811712563174883, 13.153496854155087, 13.978408296586579, 17.0, 25.0]
y = [0.0, 4.0, 6.0, 18.0, 30.0, 42.0, 54.0, 66.0, 78.0, 90.0, 102.0, 114.0, 126.0, …Run Code Online (Sandbox Code Playgroud) 如何在不考虑每个单独值的情况下用平滑,连续的线绘制以下噪声数据?我只想以更好的方式显示行为,而不关心嘈杂和极端的值。这是我正在使用的代码:
import numpy
import sys
import matplotlib.pyplot as plt
from scipy.interpolate import spline
dataset = numpy.genfromtxt(fname='data', delimiter=",")
dic = {}
for d in dataset:
dic[d[0]] = d[1]
plt.plot(range(len(dic)), dic.values(),linestyle='-', linewidth=2)
plt.savefig('plot.png')
plt.show()
Run Code Online (Sandbox Code Playgroud)

有没有办法让NumPy/SciPy` 在提取局部最大值时只保留直方图模式(在下图中显示为蓝点)?

这些最大值是使用提取的scipy.signal.argrelmax,但我只需要获取两个模式值并忽略检测到的其余最大值:
# calculate dB positive image
img_db = 10 * np.log10(img)
img_db_pos = img_db + abs(np.min(img_db))
data = img_db_pos.flatten() + 1
# data histogram
n, bins = np.histogram(data, 100, normed=True)
# trim data
x = np.linspace(np.min(data), np.max(data), num=100)
# find index of minimum between two modes
ind_max = argrelmax(n)
x_max = x[ind_max]
y_max = n[ind_max]
# plot
plt.hist(data, bins=100, normed=True, color='y')
plt.scatter(x_max, y_max, color='b')
plt.show()
Run Code Online (Sandbox Code Playgroud)
注意:
我已设法使用此平滑滤镜来获得与直方图匹配的曲线(但我没有曲线方程).
smooth默认情况下,Matlab的功能使用5点移动平均值来平滑数据.在python中做同样的事情的最佳方法是什么?例如,如果这是我的数据
0
0.823529411764706
0.852941176470588
0.705882352941177
0.705882352941177
0.676470588235294
0.676470588235294
0.500000000000000
0.558823529411765
0.647058823529412
0.705882352941177
0.705882352941177
0.617647058823529
0.705882352941177
0.735294117647059
0.735294117647059
0.588235294117647
0.588235294117647
1
0.647058823529412
0.705882352941177
0.764705882352941
0.823529411764706
0.647058823529412
0.735294117647059
0.794117647058824
0.794117647058824
0.705882352941177
0.676470588235294
0.794117647058824
0.852941176470588
0.735294117647059
0.647058823529412
0.647058823529412
0.676470588235294
0.676470588235294
0.529411764705882
0.676470588235294
0.794117647058824
0.882352941176471
0.735294117647059
0.852941176470588
0.823529411764706
0.764705882352941
0.558823529411765
0.588235294117647
0.617647058823529
0.647058823529412
0.588235294117647
0.617647058823529
0.647058823529412
0.794117647058824
0.823529411764706
0.647058823529412
0.617647058823529
0.647058823529412
0.676470588235294
0.764705882352941
0.676470588235294
0.647058823529412
0.705882352941177
0.764705882352941
0.705882352941177
0.500000000000000
0.529411764705882
0.529411764705882
0.647058823529412
0.676470588235294
0.588235294117647
0.735294117647059
0.794117647058824
0.852941176470588
0.764705882352941
Run Code Online (Sandbox Code Playgroud)
平滑的数据应该是
0
0.558823529411765
0.617647058823530
0.752941176470588 …Run Code Online (Sandbox Code Playgroud)