как построить в меньшем масштабе - PullRequest
4 голосов
/ 23 марта 2012

Я использую matplotlib, и я нахожу некоторые проблемы при попытке построить большие векторы. иногда получаю "MemoryError" У меня вопрос, есть ли способ уменьшить шкалу значений, которые мне нужно построить?

enter image description here

В этом примере я строю вектор размером 2647296!

есть ли способ построить те же значения в меньшем масштабе?

Ответы [ 2 ]

9 голосов
/ 23 марта 2012

Маловероятно, что у вас есть такое разрешение на вашем дисплее, что вы можете увидеть 2,6 миллиона точек данных на вашем графике. Простой способ представить меньше данных - это взять, например, образец. каждая 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 голос
/ 24 марта 2012

Вы можете использовать мин / макс для каждого блока данных для подвыборки сигнала.

Размер окна должен определяться на основе того, насколько точно вы хотите отобразить свой сигнал и / или насколько велико окно по сравнению с длиной сигнала.

Пример кода:

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()

Выход: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...