2D срез серии 3D-массив в NumPy - PullRequest
7 голосов
/ 08 июля 2011

У меня есть 3D-массив, который представляет значения плотности в декартовом пространстве.Чтобы получить 2D-изображение, я просто суммирую по одной из осей, используя sum(array,2), а затем использую функцию matplotlib imshow(array2D) для получения 2D-изображения.

Я хочу использовать imshow() для отображениятолько один фрагмент 3D-массива за раз, так что я могу «пролистать» через 3D-массив, чтобы увидеть различные точки изображения.

Команда среза проста: array[:,:,x], но я не вижу способаотображать каждый фрагмент по одному, по крайней мере.У кого-нибудь есть предложения, кроме ручного изменения файла программы каждый раз?Можно ли это как-то сделать интерактивно?

1 Ответ

3 голосов
/ 15 июля 2011

Я на самом деле написал код, чтобы сделать именно то, что, я думаю, вы ищете, посмотрите, поможет ли это:

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)

Просто вызовите функцию show в вашем 3d-массиве, и я скажу ему, какой фрагмент для отображения,Вы можете перемещаться по слайсам с помощью клавиш со стрелками, пока у вас выбран график.

Обратите внимание, что здесь ожидаются массивы с формой (x, y, z), вы можете, например, получить такой массив из серии 2d массивов с помощью np.dstack ((im1, im2, ...)).

См. Также Интерактивный график matplotlib с двумя ползунками для примера кода, выполняющего это с ползунками графического интерфейса пользователя

...