Ускорить Матплотлиб? - PullRequest
       12

Ускорить Матплотлиб?

13 голосов
/ 12 февраля 2011

Я прочитал здесь , что matplotlib хорош для обработки больших наборов данных. Я пишу приложение для обработки данных и встроил в wx графики matplotlib и обнаружил, что matplotlib ужасен при обработке больших объемов данных, как с точки зрения скорости, так и с точки зрения памяти. Кто-нибудь знает способ ускорить (уменьшить объем памяти) Matplotlib, кроме сокращения дискретизации ваших входов?

Чтобы проиллюстрировать, насколько плох Matplotlib с памятью, рассмотрим следующий код:

import pylab
import numpy
a = numpy.arange(int(1e7)) # only 10,000,000 32-bit integers (~40 Mb in memory)
# watch your system memory now...
pylab.plot(a) # this uses over 230 ADDITIONAL Mb of memory

Ответы [ 3 ]

4 голосов
/ 14 июня 2011

Даунсэмплинг является хорошим решением здесь - построение 10M точек потребляет кучу памяти и времени в matplotlib.Если вы знаете, какой объем памяти является приемлемым, вы можете уменьшить выборку на основе этого количества.Например, скажем, 1M точек занимает 23 дополнительных МБ памяти, и вы считаете, что это приемлемо с точки зрения пространства и времени, поэтому вам следует уменьшить выборку, чтобы она всегда была ниже 1M:что-то вроде приведенного выше фрагмента (приведенный выше может привести к слишком агрессивной выборке на ваш вкус.)

1 голос
/ 16 июля 2013

Меня также часто интересуют экстремальные значения, поэтому, прежде чем строить большие порции данных, я продолжаю следующим образом:

import numpy as np

s = np.random.normal(size=(1e7,))
decimation_factor = 10 
s = np.max(s.reshape(-1,decimation_factor),axis=1)

# To check the final size
s.shape

Конечно, np.max является просто примером функции экстремальных вычислений,

PS С помощью numpy «трюков с шагами» должна быть возможность избежать копирования данных во время изменения формы.

0 голосов
/ 16 мая 2019

Я был заинтересован в сохранении одной стороны графика выборки, поэтому я придумал следующее: (нижняя выборка - моя первая попытка)

def downsample(x, y, target_length=1000, preserve_ends=0):
    assert len(x.shape) == 1
    assert len(y.shape) == 1
    data = np.vstack((x, y))
    if preserve_ends > 0:
        l, data, r = np.split(data, (preserve_ends, -preserve_ends), axis=1)
    interval = int(data.shape[1] / target_length) + 1
    data = data[:, ::interval]
    if preserve_ends > 0:
        data = np.concatenate([l, data, r], axis=1)
    return data[0, :], data[1, :]

def geom_ind(stop, num=50):
    geo_num = num
    ind = np.geomspace(1, stop, dtype=int, num=geo_num)
    while len(set(ind)) < num - 1:
        geo_num += 1
        ind = np.geomspace(1, stop, dtype=int, num=geo_num)
    return np.sort(list(set(ind) | {0}))

def log_downsample(x, y, target_length=1000, flip=False):
    assert len(x.shape) == 1
    assert len(y.shape) == 1
    data = np.vstack((x, y))
    if flip:
        data = np.fliplr(data)
    data = data[:, geom_ind(data.shape[1], num=target_length)]
    if flip:
        data = np.fliplr(data)
    return data[0, :], data[1, :]

, что позволило мне лучше сохранить одну сторону графика:

newx, newy = downsample(x, y, target_length=1000, preserve_ends=50)
newlogx, newlogy = log_downsample(x, y, target_length=1000)
f = plt.figure()
plt.gca().set_yscale("log")
plt.step(x, y, label="original")
plt.step(newx, newy, label="downsample")
plt.step(newlogx, newlogy, label="log_downsample")
plt.legend()

test

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