0

私は Python の初心者で、線形畳み込みの小さなアニメーションを作成しようとしています。

from matplotlib import pyplot as plt
from matplotlib import animation
import math


def creer_y1():

   y1=[]
   return y1

def update_y1(i,y1):
   
   y1=[0,1,1,1,0]
   return y1,

def creer_y2():

   y2=[]
   return y2

def update_y2(i,y2):
   
   y2_stock = [0,0,0,0,0, 1,0,0,0,0, 1,1,0,0,0, 1,1,1,0,0 ,0,1,1,1,0 ,0,0,1,1,1 ,0,0,0,1,1 ,0,0,0,0,1, 0,0,0,0,0]
   y2 = y2_stock[0+5*i:5+5*i]
   
   print(y2)
   return y2,

def creer_convo():

   convo=[]
   return convo

def update_convo(i,y1,y2,convo):
   

   convo[i]=y1[0]*y2[0]+y1[1]*y2[1]+y1[2]*y2[2]+y1[3]*y2[3]+y1[4]*y2[4]
   print(convo)
   return convo,

def create_animation():
   
   fig = plt.gcf()
   ax = plt.axes(xlim=(0,10), ylim=(0,2))
   ax.set_aspect('equal')
   
   y1=creer_y1()
   y2 = creer_y2()
   convo=creer_convo()

   anim1 = animation.FuncAnimation(fig,update_y1,fargs=(y1,),frames=9,interval=1000)
   anim2 = animation.FuncAnimation(fig,update_y2,fargs=(y2,),frames=9,interval=1000)
   anim_convo = animation.FuncAnimation(fig,update_convo,fargs=(y1,y2,convo,),frames=9,interval=1000)
  
   plt.title('Linear Convolution Animation')
   plt.show()

if __name__=='__main__':
    create_animation()

エラーメッセージは次のとおりです。

convo[i]=y1[0]*y2[0]+y1[1]*y2[1]+y1[2]*y2[2]+y1[3]*y2[3]+y1[4]*y2[4]
IndexError: list index out of range

そして、animation_convo を介して update_convo を呼び出そうとすると、更新されていないバージョンの y1 と y2 が update_convo に渡されるために発生すると思います。

私はそれを処理する方法を調査しようとしましたが、解決策の 1 つは、Python で一種のポインターを使用するためにモジュール ctypes を使用しているようです。ただし、私の場合は少しやり過ぎだと思います。y1 と y2 の PyObject への参照を私の関数 update_convo に渡す方法があるかどうか疑問に思いました。

私の質問が十分に明確であることを願っています。私を助けてくれたり、情報を提供してくれたりする人にとても感謝しています。

4

0 に答える 0