Как сделать фильм из набора картинок, сложенных в массиве? - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь сделать фильм (или что-нибудь, что будет показывать результаты последовательно) из набора двумерных массивов, которые уложены в третье измерение.

Чтобы проиллюстрировать то, о чем я говорю, представьте массив массива 9x3x3, в котором у нас есть последовательность из 9 различных массивов 3x3, расположенных следующим образом:

import numpy as np
#creating an array where a position is occupied by
# 1 and the others are zero
a = [[[0,0,1],[0,0,0],[0,0,0]],[[0,1,0],[0,0,0],[0,0,0]], [[1,0,0],[0,0,0],[0,0,0]], [[0,0,0],[0,0,1],[0,0,0]], [[0,0,0],[0,1,0],[0,0,0]], [[0,0,0],[1,0,0],[0,0,0]], [[0,0,0],[0,0,0],[0,0,1]], [[0,0,0],[0,0,0],[0,1,0]], [[0,0,0],[0,0,0],[1,0,0]]]
a = np.array(a)

Так что a [0],... a [n] вернет что-то вроде:

In [10]: a[1]
Out[10]: 
array([[0, 1, 0],
       [0, 0, 0],
       [0, 0, 0]])

Но изменение позиции 1 и простой график, сделанный со следующими строками:

img = plt.figure(figsize = (8,8))
    plt.imshow(a[0], origin = 'lower')
    plt.colorbar(shrink = 0.5)
    plt.show(img)

даст вывод:

Matrix first element

Каков наиболее подходящий способ создания фильма, отображающий результаты, подобные изображенному выше, с каждым из результатов, сложенных впервое измерение «а», чтобы наблюдать, как происходят изменения на каждом отдельном шаге (кадре)?

Спасибо за ваше внимание и время!

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вы можете создать GIF из вывода, используя imageio:

import numpy as np
import matplotlib.pyplot as plt
import imageio

a = [[[0,0,1],[0,0,0],[0,0,0]], 
     [[0,1,0],[0,0,0],[0,0,0]], 
     [[1,0,0],[0,0,0],[0,0,0]], 
     [[0,0,0],[0,0,1],[0,0,0]], 
     [[0,0,0],[0,1,0],[0,0,0]], 
     [[0,0,0],[1,0,0],[0,0,0]], 
     [[0,0,0],[0,0,0],[0,0,1]], 
     [[0,0,0],[0,0,0],[0,1,0]], 
     [[0,0,0],[0,0,0],[1,0,0]]]

a = np.array(a)

images = []

for array_ in a:
    file_path = "C:\file\path\image.png"

    img = plt.figure(figsize = (8,8))
    plt.imshow(array_, origin = 'lower')
    plt.colorbar(shrink = 0.5)

    plt.savefig(file_path) #Saves each figure as an image
    images.append(imageio.imread(file_path)) #Adds images to list
    plt.clf()

plt.close()
imageio.mimsave(file_path + ".gif", images, fps=1) #Creates gif out of list of images

enter image description here

0 голосов
/ 05 июня 2018

Вы можете использовать matplotlib анимация API .

Вот быстрый прототип на основе этот пример

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

a = [[[0,0,1],[0,0,0],[0,0,0]],
     [[0,1,0],[0,0,0],[0,0,0]],
     [[1,0,0],[0,0,0],[0,0,0]],
     [[0,0,0],[0,0,1],[0,0,0]],
     [[0,0,0],[0,1,0],[0,0,0]],
     [[0,0,0],[1,0,0],[0,0,0]],
     [[0,0,0],[0,0,0],[0,0,1]],
     [[0,0,0],[0,0,0],[0,1,0]],
     [[0,0,0],[0,0,0],[1,0,0]]]
a = np.array(a)

fig, ax = plt.subplots(figsize=(4, 4))

frame = 0
im = plt.imshow(a[frame], origin='lower')
plt.colorbar(shrink=0.5)

def update(*args):
    global frame

    im.set_array(a[frame])

    frame += 1
    frame %= len(a)

    return im,

ani = animation.FuncAnimation(fig, update, interval=500)
plt.show()

Вы также можете сохранить ихв формате gif с ImageMagickFileWriter, просто заменив две последние строки на

ani = animation.FuncAnimation(fig, update, len(a))
writer = animation.ImageMagickFileWriter(fps=2)
ani.save('movie.gif', writer=writer) 

matplotlib animated gif

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...