逐帧可视化3D-numpy-array

时间:2012-07-19 14:43:04

标签: python numpy matplotlib data-visualization

# -*- coding: utf-8 -*-
"""
slider 3D numpy array

"""

import numpy
import pylab
from matplotlib.widgets import Slider

data = numpy.random.rand(100,256,256) #3d-array with 100 frames 256x256

ax = pylab.subplot(111)
pylab.subplots_adjust(left=0.25, bottom=0.25)

frame = 0
l = pylab.imshow(data[frame,:,:]) #shows 256x256 image, i.e. 0th frame

axcolor = 'lightgoldenrodyellow'
axframe = pylab.axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor)
sframe = Slider(axframe, 'Frame', 0, 100, valinit=0)

def update(val):
    frame = numpy.around(sframe.val)
    pylab.subplot(111)
    pylab.subplots_adjust(left=0.25, bottom=0.25)
    pylab.imshow(data[frame,:,:])

sframe.on_changed(update)

pylab.show()

我有一个3D-numpy-array,实际上包含大小为256x256的图像。现在我想使用滑块显示这些帧。它看起来真的很慢。有没有更好的方法呢?

2 个答案:

答案 0 :(得分:6)

尝试将更新功能重写为

def update(val):
    frame = numpy.around(sframe.val)
    l.set_data(data[frame,:,:])

这样您就不需要每次更新都重新创建所有matplotlib对象

答案 1 :(得分:0)

似乎您需要将帧号转换为整数

def update(val):
    frame = numpy.around(sframe.val)
    l.set_data(data[int(frame),:,:])

否则它将引发错误:

l.set_data(data[frame,:,:])
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices