Najprawdopodobniej jest to niezainicjowana tablica, taka jak zwracana przez np.empty. To w połączeniu z recyklingiem pamięci może prowadzić do takiego efektu, jaki widzisz. Minimalny przykład to:
for a in range(5):
y = np.empty(3,int)
x = (np.arange(3)+a)**3
print(x,y)
del x
# [0 1 8] [94838139529536 0 0]
# [ 1 8 27] [0 1 8]
# [ 8 27 64] [ 1 8 27]
# [ 27 64 125] [ 8 27 64]
# [ 64 125 216] [ 27 64 125]
Obserwuj, jak przy pierwszej iteracji yzawiera śmieci, a przy każdej kolejnej iteracji zawiera wartość poprzedniej, xponieważ przypisuje się jej pamięć, która została wcześniej zwolniona.
Możemy łatwo sprawdzić, czy w oryginalnym przykładzie tvecpojawia się również poprzedni :
def changes():
rmat=np.eye(4)
tvec=np.array([4,0.0,2.5])
(rvec, jacobian)=cv2.Rodrigues(rmat)
print(rvec)
for i in range(3):
changes()
# [[4.6609787e-310]
# [0.0000000e+000]
# [0.0000000e+000]]
# [[4. ]
# [0. ]
# [2.5]]
# [[4. ]
# [0. ]
# [2.5]]
Możemy dalej spekulować, że to szczególny wybór rmatpowoduje błąd.
Prawdopodobnie jest to błąd, który eye(4)w ogóle jest akceptowany, ponieważ oficjalnie rmatpowinien to być 3x1 1x3 lub 3x3. Rzeczywiście, 1D rmat, który nie ma 3 elementów, jest poprawnie odrzucany przez opakowanie Pythona. Podejrzewam, że matematyka 2D nie jest poprawnie sprawdzana na poziomie Pythona. Kod C wykrywa następnie nieprawidłowy kształt i nic nie robi poza zwracaniem kodu błędu, którego kod Python nie sprawdza.
Rzeczywiście, użycie rmat=eye(3)efektu znika:
def changes():
rmat=np.eye(3)
tvec=np.array([4,0.0,2.5])
(rvec, jacobian)=cv2.Rodrigues(rmat)
print(rvec)
for a in range(3):
changes()
# [[0.]
# [0.]
# [0.]]
# [[0.]
# [0.]
# [0.]]
# [[0.]
# [0.]
# [0.]]