Очень простая, но странная ошибка Python, когда переменной присваивается матрица

#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 этого будет соответствовать вашей печатной версии.