Đó là một chút thông minh.
Đầu tiên, như đã lưu ý trong một bình luận, trong Python 3
[ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
4 trả về một trình lặp, vì vậy bạn cần phải gửi lại toàn bộ điều trong [ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
5 để lấy lại danh sách thực tế, vì vậy vào năm 2020, thực tế, nó thực sự là:list[zip[*original[::-1]]]
Đây là sự cố:
6 - Tạo một bản sao nông của danh sách gốc theo thứ tự ngược lại. Cũng có thể sử dụng[ [7, 8, 9], [4, 5, 6], [1, 2, 3] ]
7 sẽ tạo ra một trình lặp ngược qua danh sách thay vì thực sự sao chép danh sách [hiệu quả hơn bộ nhớ].[ [7, 8, 9], [4, 5, 6], [1, 2, 3] ]
8 - Làm cho mỗi người phụ trong danh sách ban đầu trở thành một đối số riêng biệt với[ [7, 8, 9], [4, 5, 6], [1, 2, 3] ]
4 [tức là, giải nén danh sách][ [7, 8, 9], [4, 5, 6], [1, 2, 3] ]
4 - lấy một mục từ mỗi đối số và tạo một danh sách [tốt, một tuple] từ những mục đó và lặp lại cho đến khi tất cả những người bạn đã kiệt sức. Đây là nơi chuyển vị thực sự xảy ra.[ [7, 8, 9], [4, 5, 6], [1, 2, 3] ]
5 Chuyển đổi đầu ra của[ [7, 8, 9], [4, 5, 6], [1, 2, 3] ]
4 thành danh sách.[ [7, 8, 9], [4, 5, 6], [1, 2, 3] ]
Vì vậy, giả sử bạn có cái này:
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
Trước tiên, bạn nhận được điều này [bản sao nông cạn, đảo ngược]:
[ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
Tiếp theo, mỗi người phụ được thông qua như một đối số cho
zip[[7, 8, 9], [4, 5, 6], [1, 2, 3]]
3:zip[[7, 8, 9], [4, 5, 6], [1, 2, 3]]
[ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
4 nhiều lần tiêu thụ một mục từ đầu mỗi đối số của nó và tạo ra một bộ phận từ nó, cho đến khi không có thêm mục nào, dẫn đến [sau khi nó được chuyển đổi thành một danh sách]:[[7, 4, 1],
[8, 5, 2],
[9, 6, 3]]
Và Bob là chú của bạn.
Để trả lời câu hỏi của @ikemiguel trong một nhận xét về việc xoay nó theo hướng khác, điều đó khá đơn giản: bạn chỉ cần đảo ngược cả hai chuỗi đi vào
zip[[7, 8, 9], [4, 5, 6], [1, 2, 3]]
3 và kết quả. Điều đầu tiên có thể đạt được bằng cách loại bỏ [ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
6 và thứ hai có thể đạt được bằng cách ném [ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
7 xung quanh toàn bộ. Vì [ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
7 trả về một trình lặp qua danh sách, chúng ta sẽ cần đặt [ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
5 xung quanh để chuyển đổi nó. Với một vài cuộc gọi [ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
5 để chuyển đổi trình lặp thành một danh sách thực tế. Vì thế:rotated = list[reversed[list[zip[*original]]]]
Chúng ta có thể đơn giản hóa điều đó một chút bằng cách sử dụng lát "Martian Smiley" chứ không phải là ____ 27 ... sau đó chúng ta không cần bên ngoài
[ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
5:rotated = list[zip[*original]][::-1]
Tất nhiên, bạn cũng có thể chỉ cần xoay danh sách theo chiều kim đồng hồ ba lần. :-]
Here is the counter clockwise matrix rotation as one line in pure python [i.e., without numpy]:
Nội dung chính
- Lời mở đầu
- Xoay vector trong không gian 2D
- Xoay vector trong không gian 3D
- Xoay vector theo trục
- Euler angle
- Công thức Euler–Rodrigues
- Quaternions
- Lời kết
new_matrix = [[m[j][i] for j in range[len[m]]] for i in range[len[m[0]]-1,-1,-1]]
Như các bạn thấy thì cả bài này hầu như là một bài tổng hợp các cách xoay vector trong không gian hai chiều và ba chiều, do đó còn nhiều thiếu sót và không đầy đủ, mong các cao nhân có thể giúp đỡ thêm thắt lý thuyết công thức cho tác giả và người đọc hiểu thêm.
def rotate_matrix[ m ]:
return [[m[j][i] for j in range[len[m]]] for i in range[len[m[0]]-1,-1,-1]]
References
m = [ [1,2,3], [2,3,3], [5,4,3]]
//www.chrobotics.com/library/understanding-quaternions#:~:text=A quaternion is a four,for much more than rotations.
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
0//www.kite.com/python/answers/how-to-rotate-a-3d-vector-about-an-axis-in-python#:~:text=Rotate a vector v about,with an identity matrix I .
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
1Lời mở đầu
Xoay vector trong không gian 2D
Xoay vector trong không gian 2D
Xoay vector trong không gian 3D
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
2[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
3Xoay vector theo trục
Euler angle
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
4If you want to do this in a function, then
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
5and either way, the result for
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
6is
Xoay vector trong không gian 3D
Xoay vector theo trục
Xoay vector theo trục
Euler angle
- If you want to do this in a function, then
- and either way, the result for
- is
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
7Aside, if you want the usual transpose, then the simple one line pure python version is
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
8Euler angle
If you want to do this in a function, then
and either way, the result for
- Yaw Rotation: chuyển động quay quanh trục z của vector một góc ψ, tạo nên tọa độ mới mà trục z không thay đổi nhưng trục x, y quay theo góc ψ.
- Pitch Rotation
- Roll Rotation
- Ma trận xoay theo góc và trục chỉ định [ux, uy, uz]. Với u là unit vector
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
9Công thức Euler–Rodrigues
Định nghĩa: một phương pháp tính vị trí của rotated point.
Một phép xoay quanh trục tọa độ gốc được biểu diễn bởi 4 param a, b, c, d
Khi áp dụng công thức này, một điểm có tọa độ x sẽ xoay về một vị trí mới có tọa độ x'
Code python: hàm rotation_matrix[] trả về một ma trận xoay ngược chiều kim đồng hồ theo trục và góc.
[ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
0Quaternions
Cũng như Euler-Rodrigues, quaternion là một vector có 4 phần tử dùng để tính vị trí của rotated point. Ta cũng có thể biến đổi Euler parameters a, b, c, d trên thành các hệ số của quaternion
Một quaternion có thể tính như sau
[ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
1Xoay vector bởi quaternions bằng công thức
Một vector xoay là tích của một quaternion với nghịch đảo của nó. Quaternion này lại là tích của unit vector với liên hợp của nó.
q1:
q2:
Tích của 2 quaternions
[ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
2Sau khi có được rotated quaternions, áp dụng vào vector cần xoay sẽ sinh ra một vector mới.
[ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
3Lời kết
Như các bạn thấy thì cả bài này hầu như là một bài tổng hợp các cách xoay vector trong không gian hai chiều và ba chiều, do đó còn nhiều thiếu sót và không đầy đủ, mong các cao nhân có thể giúp đỡ thêm thắt lý thuyết công thức cho tác giả và người đọc hiểu thêm.
References
//www.chrobotics.com/library/understanding-quaternions#:~:text=A quaternion is a four,for much more than rotations.
//www.kite.com/python/answers/how-to-rotate-a-3d-vector-about-an-axis-in-python#:~:text=Rotate a vector v about,with an identity matrix I .
//gist.github.com/LyleScott/e36e08bfb23b1f87af68c9051f985302
//stackoverflow.com/questions/6802577/rotation-of-3d-vector
//stackoverflow.com/questions/17763655/rotation-of-a-point-in-3d-about-an-arbitrary-axis-using-python
//en.wikipedia.org/wiki/Rotation_matrix#Examples
//en.wikipedia.org/wiki/Euler–Rodrigues_formula