Как уменьшить накладные расходы памяти для нескольких наложенных участков журнала matplotlib? - PullRequest
0 голосов
/ 12 марта 2019

У меня есть 40 наборов данных, каждый размером около 115 МБ, и я хотел бы построить их все вместе на одном графике в масштабе журнала.

# make example data 
import numpy as np
data_x = []
data_y = []
for _ in range(40):
    x, y = np.random.random(size = (2, int(7e6))) # 7e6 chosen to make about 115MB size
    data_x.append(x)
    data_y.append(y)
del x, y

# now show the size of one set in MB
print((data_x[0].nbytes + data_y[0].nbytes)/1e6, 'MB')
# 112.0 MB

На моем компьютере доступно около 30 ГБ оперативной памяти, поэтому я полностью ожидаю, что 40*112MB = 4.5GB подойдет.

Я хотел бы создать наложенный журнал для каждого набора данных:

import matplotlib.pyplot as plt 
for x,y in zip(data_x, data_y):
    plt.loglog(x, y)
plt.show()

Но объем памяти слишком велик. Я бы предпочел не сокращать данные. Есть ли способ, которым я мог бы уменьшить накладные расходы памяти, чтобы построить эти 4.5GB данных?

Я бы предпочел оставить цикл for, поскольку мне нужно изменить стиль точек и цвет каждого графика в нем, поэтому объединение наборов данных нежелательно.

Наиболее похожий вопрос, который я мог найти, это здесь , но это отличается тем, что цикл используется для создания отдельных графиков, а не для добавления к одному графику, поэтому добавление команды plt.clf() в петля не помогает мне.

1 Ответ

1 голос
/ 12 марта 2019

Вот моя попытка решить вашу проблему:

# make example data 
import numpy as np
import matplotlib.pyplot as plt
import colorsys

data_x = np.random.random((40, int(7e6)))*np.logspace(0, 7, 40)[:, None]
data_y = np.random.random((40, int(7e6)))*np.logspace(0, 7, 40)[:, None]

# now show the size of one set in MB
print((data_x[0].nbytes + data_y[0].nbytes)/1e6, 'MB')

x, y = np.log(data_x), np.log(data_y)

hists = [np.histogram2d(x_, y_, bins=1000) for x_, y_ in zip(x,y)]

N = len(hists)

for i, h in enumerate(hists):
    color = colorsys.hsv_to_rgb(i/N, 1, 1)
    rows, cols = np.where(h[0]>0)
    plt.scatter(h[1][rows], h[2][cols], color=color, s=1)

Результат:

enter image description here

Я беру журнал обоихданные x и y, а затем перейдите к корзине.Поскольку я не думаю, что вас интересуют плотности, я просто изобразил статический цвет, в котором корзина содержит более одного элемента.

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