私は 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 に渡す方法があるかどうか疑問に思いました。
私の質問が十分に明確であることを願っています。私を助けてくれたり、情報を提供してくれたりする人にとても感謝しています。