2017-06-14 146 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)