numpy中对3D数组进行2D切片序列操作

8 投票
1 回答
7680 浏览
提问于 2025-04-16 21:04

我有一个三维数组,这个数组表示了在笛卡尔空间中的密度值。为了得到一个二维图像,我只需要在其中一个轴上进行求和,使用 sum(array,2),然后用 matplotlib 的 imshow(array2D) 函数来生成这个二维图像。

我想做的是使用 imshow() 来一次只显示三维数组中的一个切片,这样我就可以“翻页”查看三维数组中的不同图像部分。

切片的命令很简单:array[:,:,x],但是我找不到一种方法可以一次显示每个切片。有没有人有其他建议,除了每次手动修改程序文件?有没有什么方法可以让这个过程变得更互动一些呢?

1 个回答

4

其实我写了段代码,正好可以实现你想要的功能,看看这段代码是否对你有帮助:

import numpy as np
import pylab

class plotter:
    def __init__(self, im, i=0):
        self.im = im
        self.i = i
        self.vmin = im.min()
        self.vmax = im.max()
        self.fig = pylab.figure()
        pylab.gray()
        self.ax = self.fig.add_subplot(111)
        self.draw()
        self.fig.canvas.mpl_connect('key_press_event',self)

    def draw(self):
        if self.im.ndim is 2:
            im = self.im
        if self.im.ndim is 3:
            im = self.im[...,self.i]
            self.ax.set_title('image {0}'.format(self.i))

        pylab.show()

        self.ax.imshow(im, vmin=self.vmin, vmax=self.vmax, interpolation=None)


    def __call__(self, event):
        old_i = self.i
        if event.key=='right':
            self.i = min(self.im.shape[2]-1, self.i+1)
        elif event.key == 'left':
            self.i = max(0, self.i-1)
        if old_i != self.i:
            self.draw()
            self.fig.canvas.draw()


def slice_show(im, i=0):
    plotter(im, i)

只需要在你的三维数组上调用这个显示函数,我会告诉它显示哪一部分。只要你选中了图表,就可以用箭头键来切换不同的部分。

需要注意的是,这个代码是针对形状为 (x, y, z) 的数组的。比如,你可以通过将一系列二维数组用 np.dstack((im1, im2, ...)) 组合成这样的三维数组。

另外,你可以查看 这个链接,里面有一个使用图形界面滑块的代码示例。

撰写回答