#python #numpy
#питон #тупица
Вопрос:
Это беспокоило меня долгое время, код такой, как показано ниже, вы можете запустить его напрямую:
x = [1,2,3] y = [1,2,3] z = [1,2,3] theta_x = 20*np.pi/180 theta_y = 70*np.pi/180 # rotation matrix rot_x = np.array([[1, 0, 0], [0, np.cos(theta_x), -np.sin(theta_x)], [0, np.sin(theta_x), np.cos(theta_x)]]) rot_y = np.array([[np.cos(theta_y), 0, np.sin(theta_y)], [0, 1, 0], [-np.sin(theta_y), 0, np.cos(theta_y)]]) print('Print 1, rotated x: ', (rot_y@rot_x@(np.array([x , y , z ])))[0]) print('Print 1, rotated y: ', (rot_y@rot_x@(np.array([x , y , z ])))[1]) print('Print 1, rotated z: ', (rot_y@rot_x@(np.array([x , y , z ])))[2]) print('n') # Assign the rotated variables to the original variables x = (rot_y@rot_x@(np.array([x, y , z ])))[0] y = (rot_y@rot_x@(np.array([x, y , z ])))[1] z = (rot_y@rot_x@(np.array([x , y , z ])))[2] print('Print 2, rotated x: ', x) print('Print 2, rotated y: ', y) print('Print 2, rotated z: ', z)
Что действительно странно, так это то, что результаты первого и второго отпечатков должны быть идентичными, но это не так. Первые две строки хороши, но последняя-нет. Я не знаю, почему.
====
P.S. Результат выглядит следующим образом:
Print 1, rotated x: [1.54643617 3.09287234 4.63930851] Print 1, rotated y: [0.59767248 1.19534495 1.79301743] Print 1, rotated z: [-0.50132104 -1.00264208 -1.50396311] Print 2, rotated x: [1.54643617 3.09287234 4.63930851] Print 2, rotated y: [0.59767248 1.19534495 1.79301743] Print 2, rotated z: [-1.06186645 -2.12373291 -3.18559936]
Комментарии:
1. Вы присваиваете переменным x и y новые, разные значения перед
z = (rot_y@rot_x@(np.array([x , y , z ])))[2]
вторым вычислением, поэтому результаты отличаются.2. @hpaulj Извините за неудобства, я обновил код с помощью theta_x
3. Кстати, это совпадение, которое
y
тоже осталось прежним , такrot_y@rot_x
как дает 0 в(0,1)
, следовательно, неуязвимо для изменения вx
np.array([x, y, z])
Ответ №1:
В этой части вашего кода вы присваиваете новые значения x
, а затем y
, таким образом, вы больше не оцениваете одну и ту же функцию.
# Assign the rotated variables to the original variables x = (rot_y@rot_x@(np.array([x, y , z ])))[0] y = (rot_y@rot_x@(np.array([x, y , z ])))[1] z = (rot_y@rot_x@(np.array([x , y , z ])))[2]
Если вы это сделаете:
x,y,z = (rot_y@rot_x@(np.array([x, y , z ])))
вместо z
этого будет соответствовать вашей печатной версии.