Масштабирование 2D массива логарифмически в Python - PullRequest
1 голос
/ 28 июня 2019

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

Я могу построить данные логарифмически по оси Y, используя Matplotlib, но я хочу получить доступ к представлению 2D массива этого недавно масштабированного изображения,но Matplotlib предоставляет только исходный немасштабированный массив Scikit-image масштабирует 2D-массивы линейно, но не логарифмически.

# plot a log-scaled z
w, h = z.shape
fig, ax = plt.subplots()
ax.set_yscale('symlog')
mesh = ax.pcolormesh(np.arange(h+1), np.arange(w+1), z)
# get the array of z
logimg = mesh.get_array().reshape(mesh._meshHeight, mesh._meshWidth)

1 Ответ

0 голосов
/ 28 июня 2019

Давайте начнем с некоторых примеров данных:

import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pylab as plt

# some 2D example data
x, y = np.arange(30)+1, np.arange(20)+1
x_grid, y_grid = np.meshgrid(x, y)
z_grid = np.cos(2*np.pi*x_grid/10) + np.sin(2*np.pi*y_grid/4)

# Graph 1
plt.pcolormesh(x, np.log(y), z_grid);
plt.xlabel('x'); plt.ylabel('log(y) (non regular spacing)');

Вот график с log (y) в качестве вертикальной оси.В этом случае выборка вдоль y является неоднородной (данные не изменяются, они рисуются только на деформированной сетке):

graph after

Для деформацииДля данных на регулярной сетке выполняется интерполяция между log(y) и новой регулярной сеткой y:

# Interpolation of the transformed data on a regular new y axis
ylog_interpolation = interp1d(np.log(y), z_grid.T)
new_y = np.linspace(min(np.log(y)), max(np.log(y)), len(y))
new_z_grid = ylog_interpolation(new_y).T

# axis
plt.pcolormesh(x, new_y, new_z_grid);
plt.xlabel('x'); plt.ylabel('new y (regular spacing)');

after interolation

Теперь сеткаобычный, но данные искажены, new_z_grid можно экспортировать как изображение.

...