带有matplotlib和numpy的动画

2024-06-01 06:14:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我怀疑下面的代码有什么区别。我使用matplotlib的animation类来渲染numpy的数组。在atualizaMundo()函数中,如果我使用mundo[:] = new_mundo[:],它工作得很好,但是如果我使用mundo=new_mundo,数组将相等,但动画不起作用。这有什么区别?在

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

ON = 255
OFF = 0

def criaMundo(N):
    return(np.random.choice([ON,OFF],N*N,p=[0.5,0.5]).reshape(N,N))


def atualizaMundo(frameNum,N,mundo,img):
    new_mundo = np.random.choice([ON,OFF],N*N,p=[0.5,0.5]).reshape(N,N)
    img.set_data(mundo)
    mundo[:]=new_mundo[:]
    #mundo=new_mundo
    return(img,)

def main():
    try:        
        N = 4
        mundo = criaMundo(N)
        print(mundo)
        fig1,ax = plt.subplots()
        img = ax.imshow(mundo)
        animacao = animation.FuncAnimation(fig1, atualizaMundo, fargs=(N,mundo,img,), blit=True)
        plt.show()
    except Exception as ex:
        pass

if __name__ == '__main__':
    try:
        main()
    except Exception as fk:
        pass

Tags: importimgnewmatplotlibmainondefas
1条回答
网友
1楼 · 发布于 2024-06-01 06:14:18

mundo[:]=new_mundo[:]修改现有数组mundo。因此,您总是在同一个对象上操作,对它所做的更改将反映在动画中。下一次动画调用函数时,同一对象作为参数传递,以便保留上一次调用中所做的更改。注意,mundo[:]=new_mundo[:]等同于mundo[:]=new_mundo。在

{将一个新的数组赋值给>>>><。但是,它只是局部作用域,一旦函数完成,更改的mundo就不再存在了。在对函数的下一次调用中,旧的和未更改的mundo再次传递给函数,导致静态动画。在

应该注意的是,在这种情况下,实际上根本不需要传递mundo,因为您只需将新计算的数组new_mundo直接设置为图像:img.set_data(new_mundo)。在

相关问题 更多 >