Це, швидше за все, неініціалізований масив, такий як повертається 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.]]