cục mịch. định hình lại không phải lúc nào cũng hoạt động như mong đợi và nhiều lần tôi gần như phát điên khi tìm kiếm các lỗi trong mã của mình và cuối cùng Đó là do np. định hình lại không hoạt động như tôi mong đợi và một số phần tử của mảng cũ đã kết thúc ở những vị trí không mong muốn trong mảng mới. Vì điều này, nhiều lần tôi đã làm việc xung quanh np. định hình lại, nhưng hôm nay tôi sẽ đối mặt với định mệnh của mình
hình dạng mảngmảng một chiều
Trong NumPy, một mảng có hình dạng cụ thể. Khi chúng ta tạo một mảng với np. mảng, numpy tự động suy ra hình dạng. Hãy tạo mảng một chiều
[Tất cả hình ảnh được cung cấp bởi tác giả]
Chúng ta có thể in hình dạng của mảng bằng cách gõ
Hình dạng của mảng này sẽ là
Đừng để bị phân tâm bởi dấu phẩy trong bộ hình dạng, nó chỉ ở đó để chúng ta có thể xác định nó là một bộ. Nó vẫn là một mảng một chiều
mảng hai chiều
Khi tạo mảng hai chiều ta phải dùng dấu ngoặc kép
Chúng ta có thể in hình dạng của mảng bằng cách gõ
Hình dạng của mảng này sẽ là
Hình dạng của mảng là. [số hàng, số cột]. Hay nói cách khác [chỉ mục đầu tiên, chỉ mục thứ hai]
Để hiểu điều này với chỉ mục đầu tiên, chỉ mục thứ hai tốt hơn một chút. Hãy tưởng tượng toàn bộ mảng trải dài như thế này
Khi chúng ta lập chỉ mục mảng theo cách sau
Chúng tôi áp dụng chỉ số đầu tiên [1]
Sau đó, chỉ số thứ hai [2]
mảng 3 chiều
Chúng ta có thể tạo một mảng ba chiều bằng cách sử dụng ba mức dấu ngoặc
Sau đó, chúng tôi có chỉ số thứ nhất, thứ hai và thứ ba
Mảng nhiều chiều hơn
Đối với bất kỳ mảng nào có nhiều chiều hơn, chúng ta có thể áp dụng logic tương tự. Chỉ mục đầu tiên là chỉ mục bên ngoài nhất và chỉ mục cuối cùng là chỉ mục được bao bọc trong nhiều dấu ngoặc nhất
np. định hình lạiCó hai bước suy nghĩ trong quá trình định hình lại. Bước đầu tiên là cuộn mảng thành một đường thẳng và bước thứ hai là cuộn nó trở lại hình dạng được chỉ định mới
Bây giờ câu hỏi là. Thứ tự mà các phần tử được mở ra và cuộn thành hình dạng mới là gì?
thứ tự = 'C'
C thực sự là viết tắt của ngôn ngữ lập trình C. Đây là thứ tự mặc định và nếu chúng ta gõ
Sau đó, mảng “arr” được định hình lại thành hình dạng [3,4]. Và thứ tự sẽ là thứ tự C. Vì vậy, nó sẽ giống như
Với thứ tự C, cả hai chúng tôi đều hủy đăng ký và khôi phục với chỉ mục cuối cùng thay đổi nhanh nhất và chỉ mục đầu tiên thay đổi chậm nhất
Đối với mảng 2 chiều, chúng tôi bỏ chọn mảng có chỉ số [giây] cuối cùng thay đổi nhanh nhất. Và chúng tôi quay lại với chỉ số [giây] cuối cùng thay đổi nhanh nhất
Toàn bộ quá trình cũng có thể được nhìn thấy trong hình ảnh động sau đây
Đối với mảng 3 chiều, chúng tôi bỏ chọn mảng có chỉ số cuối cùng [thứ ba] thay đổi nhanh nhất. Và chúng tôi quay lại với chỉ số [thứ ba] cuối cùng thay đổi nhanh nhất
Khi bạn đã hiểu cách thức hoạt động của nó, bạn cũng có thể chuyển trực tiếp từ mảng đầu vào sang mảng đầu ra, bỏ qua bước hủy kiểm soát. Chúng ta cũng có thể định hình lại mảng 2 chiều thành mảng 3 chiều và thực tế là mọi sự kết hợp khác của các chiều có thể tưởng tượng được. Tôi có thể đưa ra nhiều ví dụ hơn ở đây, nhưng nếu bạn tuân thủ nghiêm ngặt quy trình hủy cuộn và định hình lại thành dạng mong muốn, thì sẽ rất dễ hiểu
thứ tự = 'F'
F thực sự là viết tắt của ngôn ngữ lập trình Fortran. Để sử dụng thứ tự này, chúng ta phải chỉ định nó, ví dụ
Theo thứ tự Fortran, chúng ta hủy đăng ký bằng cách thay đổi chỉ số đầu tiên nhanh nhất, chỉ số thứ hai chỉ số cuối cùng thay đổi chậm nhất
Đối với mảng 2 chiều, chúng ta có chỉ số đầu tiên thay đổi nhanh nhất và chỉ số thứ hai chậm nhất
Một chút hoạt hình
Đối với mảng numpy ba chiều, chỉ số đầu tiên thay đổi nhanh nhất và chỉ số thứ ba chậm nhất
thứ tự = 'A'
order = 'A', định hình lại theo thứ tự C hoặc theo thứ tự Fortran, tùy thuộc vào cách mảng được lưu trữ trong bộ nhớ. Nếu nó được lưu trong bộ nhớ, như trong ngôn ngữ lập trình C, thì order = ‘A’ sẽ định hình lại bằng C order. Nếu mảng được lưu trữ trong bộ nhớ như trong ngôn ngữ lập trình Fortran, thì nó sẽ định hình lại theo thứ tự fortran. Điều này có khả năng tăng tốc mã của bạn, nhưng tôi thực sự chưa bao giờ sử dụng nó, vì kết quả không thể dự đoán được
Hủy đăng ký theo thứ tự Fortran và định hình lại theo thứ tự C?
Chúng ta có thể sử dụng np. hàm ravel để hủy đăng ký một mảng theo thứ tự Fortran và np. định hình lại để định hình lại mảng không được kiểm soát theo thứ tự C
Định hình lại giống như hoạt hình
Bỏ cuộn theo thứ tự C và định hình lại theo thứ tự F
Chúng tôi chỉ cắt xén theo thứ tự C và định hình lại theo thứ tự F, điều này sẽ dễ hiểu, nhưng đây là một hình ảnh động, để bạn có thể thực sự nhìn thấy nó
Giống như trong np. định hình lại, thứ tự mặc định trong np. ravel là C. Vì vậy, nếu chúng tôi không chỉ định nó, np. ravel sẽ mở theo thứ tự C
-1 trong np. định hình lại
Chúng ta có thể sử dụng -1 trong một hình dạng trong np. định hình lại. -1 Là trình giữ chỗ và tự động nhận giá trị phù hợp để hình dạng đầu vào và đầu ra khớp với nhau. Điều này đặc biệt hữu ích nếu chúng ta viết một hàm và chúng ta không biết kích thước chính xác của mảng đầu vào, nhưng chúng ta biết ví dụ, rằng đầu ra phải có 2 cột. Nhưng lưu ý rằng chỉ có một giá trị tại một thời điểm có thể được thay thế bằng -1. Vì vậy, chúng ta phải biết tất cả trừ một chiều của mảng đầu ra