Це, швидше за все, неініціалізований масив, такий як повертається np.empty. Це разом із переробкою пам’яті може призвести до того ефекту, який ви бачите. Мінімальним прикладом може бути:
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]
Слідкуйте за тим, як при першій ітерації yміститься сміття, а при кожній наступній ітерації воно містить значення попереднього, xоскільки йому присвоюється пам'ять, звільнена безпосередньо перед цим.
Ми можемо легко перевірити, що в оригінальному прикладі з'являється також попередній tvec:
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]]
Ми можемо додатково припускати, що саме цей вибір rmatвикликає помилку.
Це, мабуть, помилка, яку eye(4)взагалі приймають, оскільки, офіційно, вона rmatповинна бути 3x1 1x3 або 3x3. Дійсно, 1D, rmatщо не має 3 елементів, правильно відхиляється обгорткою Python. Я підозрюю, що 2D ´rmat`s не перевіряються належним чином на рівні Python. Потім код C виявляє неправильну форму, нічого не робить, крім повернення коду помилки, на який не перевіряється код Python.
Дійсно використання rmat=eye(3)ефекту відпадає:
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.]]