我正在使用matplotlib,我在尝试绘制大型矢量时发现了一些问题。 有时得到“MemoryError” 我的问题是,是否有任何方法可以减少我需要绘制的值的规模?
在这个例子中,我正在绘制一个大小为2647296的矢量!
有没有办法以较小的比例绘制相同的值?
答案 0 :(得分:9)
您的显示器上的分辨率太高,您可以在绘图中看到260万个数据点。绘制较少数据的简单方法是例如每1000分:plot(x[::1000])
。如果失去太多而且例如重要的是要看到极值,你可以编写一些代码将长向量分成适当的多个部分,并取每个部分的最小值和最大值,然后绘制:
tmp = x[:len(x)-len(x)%1000] # drop some points to make length a multiple of 1000
tmp = tmp.reshape((1000,-1)) # split into pieces of 1000 points
tmp = tmp.reshape((-1,1000)) # alternative: split into 1000 pieces
figure(); hold(True) # plot minimum and maximum in the same figure
plot(tmp.min(axis=0))
plot(tmp.max(axis=0))
答案 1 :(得分:1)
您可以使用每个数据块的最小值/最大值对信号进行二次采样。
窗口大小必须根据您希望显示信号的准确程度和/或窗口与信号长度的比较来确定。
示例代码:
from scipy.io import wavfile
import matplotlib.pyplot as plt
def value_for_window_min_max(data, start, stop):
min = data[start]
max = data[start]
for i in range(start,stop):
if data[i] < min:
min = data[i]
if data[i] > max:
max = data[i]
if abs(min) > abs(max):
return min
else:
return max
# This will only work properly if window_size divides evenly into len(data)
def subsample_data(data, window_size):
print len(data)
print len(data)/window_size
out_data = []
for i in range(0,(len(data)/window_size)):
out_data.append(value_for_window_min_max(data,i*window_size,i*window_size+window_size-1))
return out_data
sample_rate, data = wavfile.read('<path_to_wav_file>')
sub_amt = 10
sub_data = subsample_data(data, sub_amt)
print len(data)
print len(sub_data)
fig = plt.figure(figsize=(8,6), dpi=100)
fig.add_subplot(211)
plt.plot(data)
plt.title('Original')
plt.xlim([0,len(data)])
fig.add_subplot(212)
plt.plot(sub_data)
plt.xlim([0,len(sub_data)])
plt.title('Subsampled by %d'%sub_amt)
plt.show()
输出: