【问题标题】:Scale a 2D array logarithmically in Python在 Python 中以对数方式缩放二维数组
【发布时间】:2019-11-09 22:11:27
【问题描述】:

我有一个 2D 频谱图数据数组,我正在使用 scikit-image 对其进行缩放,以便在 Web 浏览器中显示。我想在 y 轴上以对数方式缩放数组。”

我可以使用 Matplotlib 在 y 轴上以对数方式绘制数据,但我想访问这个新缩放图像的二维数组表示,但 Matplotlib 只提供原始的、未缩放的数组。 Scikit-image 线性缩放二维数组,但不是对数。

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

【问题讨论】:

标签: python image numpy matplotlib scikit-image


【解决方案1】:

让我们从一些示例数据开始:

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 的采样是不均匀的(数据不变,它们只绘制在变形的网格上):

为了得到规则网格上的变形数据,在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)');

现在,网格是规则的,但数据是变形的,new_z_grid 可以导出为图像。

【讨论】:

    猜你喜欢
    • 2011-05-25
    • 2016-02-25
    • 1970-01-01
    • 2012-02-17
    • 2015-12-13
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多