2017-06-14 147 views
0

我对下面的代码有什么区别有疑问。我正在使用matplotlib的动画类来渲染numpy的数组。在atualizaMundo()功能,如果我使用mundo[:] = new_mundo[:]它工作得很好,但如果我使用mundo=new_mundo数组相等,但动画不起作用。这里有什么不同?matplotlib和numpy的动画

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 
+0

虽然https://stackoverflow.com/questions/19676538/numpy-array-assignment-with-copy给出了一些见解,但它并没有回答为什么动画在两种情况下工作方式不同的问题 - 这也是由变量的局部范围。 – ImportanceOfBeingErnest

+0

[Numpy数组赋值与副本]的可能重复(https://stackoverflow.com/questions/19676538/numpy-array-assignment-with-copy) – eyllanesc

回答

1

线mundo[:]=new_mundo[:]修改现有数组mundo。因此,您总是对同一个对象进行操作,并对其进行的更改反映在动画中。下次通过动画调用该函数时,同一对象将作为参数传递,以保留前一次调用中所做的更改。请注意,mundo[:]=new_mundo[:]相当于mundo[:]=new_mundo

反对到mundo=new_mundo受让人新阵列称为mundo的局部变量,它取代了传递的参数mundo。但是,这只是本地范围,一旦功能完成,更改后的mundo就不再存在。在下一次调用该函数时,旧的和​​未更改的mundo再次传递给函数,导致产生静态动画。

需要注意的是,在这种情况下,您根本不需要通过mundo,因为您可以直接将新计算的数组new_mundo直接设置为图像:img.set_data(new_mundo)