Hướng dẫn python rotate 2d list - python xoay danh sách 2d

Đó 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ố:

  • [ [7, 8, 9],
      [4, 5, 6],
      [1, 2, 3] ]
    
    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.

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]]

http://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

https://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] ]
1

Lờ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] ]
3

Xoay vector theo trục

Euler angle

[ [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9] ]
4

If you want to do this in a function, then

[ [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9] ]
5

and either way, the result for

[ [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9] ]
6

is

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] ]
7

Aside, if you want the usual transpose, then the simple one line pure python version is

[ [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9] ]
8

Euler 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] ]
9

Cô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] ]
0

Quaternions

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] ]
1

Xoay 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] ]
2

Sau 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] ]
3

Lờ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

http://www.chrobotics.com/library/understanding-quaternions#:~:text=A quaternion is a four,for much more than rotations.

https://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 .

https://gist.github.com/LyleScott/e36e08bfb23b1f87af68c9051f985302

https://stackoverflow.com/questions/6802577/rotation-of-3d-vector

https://stackoverflow.com/questions/17763655/rotation-of-a-point-in-3d-about-an-arbitrary-axis-using-python

https://en.wikipedia.org/wiki/Rotation_matrix#Examples

https://en.wikipedia.org/wiki/Euler–Rodrigues_formula