2

探索目的で使用するため、軸を共有して一度に複数の画像をプロットしています。各画像は、異なる日付の同じ衛星画像です。ズームとパンの際にmatplotlibからの遅い応答を実験しています。プロセスをスピードアップできるヒントをお聞きしたいと思います。

私が今していることは:

  • 複数のnetcdfファイルからデータをロードします。

  • 正規化のために、すべてのデータの最大値を計算します。

  • ImageGridを使用してサブプロットのグリッドを作成します。各サブプロットが生成されると、配列を削除してメモリを解放します(各配列はリストに格納され、「削除」は単なるlist.pop()です)。以下のコードを参照してください。

それぞれ4600x3840ピクセルの15枚の画像(シングルチャンネル)です。ボトルネックはRAM(8 GBあります)ではなく、プロセッサであることに気づきました。Pythonは、ズームまたはパン時にコアの1つで100%の使用率に急上昇します(これは、Intel(R)Core(TM)i5-2500 CPU @ 3.30GHz、4コア、64ビットです)。

コードは次のとおりです。

import os
import sys

import numpy as np
import netCDF4 as ncdf
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import ImageGrid
from matplotlib.colors import LogNorm

MIN = 0.001 # Hardcoded minimum data value used in normalization

variable = 'conc_chl'
units = r'$mg/m^3$'
data = []
dates = []

# Get a list of only netCDF files
filelist = os.listdir(sys.argv[1])
filelist = [f for f in filelist if os.path.splitext(f)[1] == '.nc']
filelist.sort()
filelist.reverse()

# Load data and extract dates from filenames
for f in filelist:
    dataset = ncdf.Dataset(os.path.join(sys.argv[1],f), 'r')
    data.append(dataset.variables[variable][:])
    dataset.close()
    dates.append((f.split('_')[2][:-3],f.split('_')[1]))

# Get the maximum value of all data. Will be used for normalization
maxc = np.array(data).max()

# Plot the grid of images + dates
fig = plt.figure()
grid = ImageGrid(fig, 111,\
        nrows_ncols = (3, 5),\
        axes_pad = 0.0,\
        share_all=True,\
        aspect = False,\
        cbar_location = "right",\
        cbar_mode = "single",\
        cbar_size = '2.5%',\
        )
for g in grid:
    v = data.pop()
    d = dates.pop()
    im = g.imshow(v, interpolation='none', norm=LogNorm(), vmin=MIN, vmax=maxc)
    g.text(0.01, 0.01, '-'.join(d), transform = g.transAxes) # Date on a corner
cticks = np.logspace(np.log10(MIN), np.log10(maxc), 5)
cbar = grid.cbar_axes[0].colorbar(im)
cbar.ax.set_yticks(cticks)
cbar.ax.set_yticklabels([str(np.round(t, 2)) for t in cticks])
cbar.set_label_text(units)

# Fine-tune figure; make subplots close to each other and hide x ticks for
# all
fig.subplots_adjust(left=0.02, bottom=0.02, right=0.95, top=0.98, hspace=0, wspace=0)
grid.axes_llc.set_yticklabels([], visible=False)
grid.axes_llc.set_xticklabels([], visible=False)

plt.show()

応答性を高めるために何を改善できるかについての手がかりはありますか?

4

1 に答える 1

1

設定interpolation='none'は、「最も近い」(または「双線形」)に設定するよりも大幅に遅いようです。サポートされているバックエンド(Aggバックエンドなど)では、「none」と「nearest」のコードパスが異なります。「nearest」はAggの補間ルーチンに渡されますが、「none」は画像のサンプリングされていない再スケールを行います(私は今読んでいます)ここにコードコメントがあります)。

これらの異なるアプローチは、異なる定性的な結果をもたらします。たとえば、以下のコードスニペットは、わずかなモアレパターンを示していますが、。の場合は表示されませんinterpolation='none'

import matplotlib.pyplot as plt
import numpy as np

img = np.random.uniform(0, 255, size=(2000, 2000)).astype(np.uint8)

plt.imshow(img, interpolation='nearest')
plt.show()

「none」は、ズームイン(画像ピクセルが画面ピクセルよりも大きい)の場合は「nearest」とほぼ同じだと思いますが、ズームアウト(画像ピクセルが画面ピクセルよりも小さい)の場合は高次の補間結果が得られます。遅延は、再スケーリングに必要な追加のMatplotlib/Python計算によるものだと思います。

于 2012-05-24T14:05:32.260 に答える