Hướng dẫn dùng np.prod python python
Show Nội dung chính Show
Hôm nay mình sẽ giới thiệu cho các bạn về sử dụng thư viện numpy, mục đích một phần cũng để note lại kiến thức cho nhớ và khi nào cần mình có thể vào đây xem lại. Install NumPyĐể cài đặt Python NumPy, cách đơn giản nhất là mở command của bạn và gõ:
Sau khi cài đặt kết thúc, khi bạn muốn sử dụng thì bạn khai báo đơn giản như sau:
Vì
numpy là thư viện được sử dụng thường xuyên nên nó thường được khai báo gọn lại như trên NumPy là gì ?Theo định nghĩa trên trang chủ của Numpy.
Bạn có thể hiểu đơn giản: NumPy (Numeric Python) là là thư viện cốt lõi cho tính toán khoa học trong Python. Nó cung cấp một đối tượng mảng đa chiều hiệu suất cao và các công cụ để làm việc với các mảng này. Hãy xem qua một ví dụ cho thấy NumPy mạnh như thế nào. Giả sử chúng ta có hai list a và b, bao gồm 100.000 số không âm đầu tiên và chúng tôi muốn tạo một list mới c có phần tử thứ i là a[i] + 2 * b[i] Với cách bình thường không dùng NumPy: Khi dùng NumPy: Nhìn vào ta thấy kết quả dùng NumPy nhanh hơn rất nhiều lần và cùng với một mục địch thì ta dùng ít dòng code hơn và bản thân dòng code của chúng ta cũng trực quan hơn. Python thông thường chậm hơn nhiều do kiểm tra kiểu và chi phí khác cần phải thông dịch mã và hỗ trợ Python's abstractions. Ví dụ: nếu chúng ta đang thực hiện một số điều kiện trong một vòng lặp, việc liên tục kiểm tra kiểu trong một vòng lặp sẽ dẫn đến nhiều tập lệnh hơn là chỉ thực hiện một thao tác bổ sung thông thường. NumPy, sử dụng tối ưu hóa mã C được biên dịch trước, có thể tránh được rất nhiều chi phí. Quá trình ta sử dụng ở trên là vectorization. Vectorization đề cập đến việc áp dụng các hoạt động cho các mảng thay vì chỉ các phần tử riêng lẻ (tức là không có vòng lặp). Tại sao lại vectorize?. Nó bao gồm các lý do sau:
Vectorization chính là một trong những lý do vì sao NumPy rất mạnh mẽ. ndarrayndarrays, mảng n chiều của kiểu dữ liệu đồng nhất, là kiểu dữ liệu cơ bản được sử dụng trong NumPy. Vì các mảng này cùng kiểu và có kích thước cố định khi tạo, chúng cung cấp độ linh hoạt kém hơn so với danh sách Python, nhưng về cơ bản có thể hiệu quả hơn về thời gian chạy và bộ nhớ. (Danh sách Python là mảng các con trỏ tới các đối tượng, thêm một lớp tham chiếu). Số chiều chính là rank của mảng đó, shape của array là một tuple số nguyên đưa ra size của mảng theo mỗi chiều. Có thể tạo ndarray từ Python lists và truy cập vào các phần tử bằng dấu ngoặc vuông như sau:
Khi muốn tạo 1 mảng mới = 1 mảng cũ ta khác ta nên sử dụng như sau để khi thay đổi phân tử của mảng thì không ảnh hưởng đến mảng kia.
Tạo ndarray với hàm zeros():
Tạo ndarray với hàm ones():
Tạo ndarray với hàm full()
Tạo ma trận đơn vị
Tạo một numpy array với giá trị ngẫu nhiên
Bạn có thể tham khảo nhiều cách tạo ndarry trong documentation. Dưới đây là 1 số hàm hữu ích để theo dõi shape; hữu ích cho việc gỡ lỗi và biết kích thước sẽ rất hữu ích khi tính toán gradient. reshape: Cung cấp một hình dạng mới cho một mảng mà không thay đổi dữ liệu của nó.
Trong phương thức reshape(), ta có thể dùng tham số -1 trong việc reshape với một dimension ta không biết mà numpy sẽ tự tìm ra dựa trên tất các các dimensions khác và array size. Bạn có thể xem ví dụ sau để trực quan hơn.
Các cách chuyển mảng về mảng 1 chiều.
NumPy hỗ trợ một mô hình hướng đối tượng, sao cho ndarray có một số phương thức và thuộc tính, với các hàm tương tự như trong namespace NumPy ngoài cùng. Ví dụ, chúng ta có thể làm cả hai cách và cho kết quả như nhau:
DatatypesMỗi mảng numpy là một lưới các phần tử cùng loại. Numpy cung cấp một tập hợp lớn các kiểu dữ liệu số mà bạn có thể sử dụng để xây dựng các mảng. Numpy cố gắng đoán một kiểu dữ liệu khi bạn tạo một mảng, nhưng các hàm xây dựng các mảng thường cũng bao gồm một đối số tùy chọn để chỉ định rõ ràng kiểu dữ liệu. Đây là một ví dụ:
Bạn có thể đọc tất cả về kiểu dữ liệu numpy trong documentation Array Operations/MathBasic mathNumPy hỗ trợ rất nhiều các phép toán cơ bản như sau:
Dot productChú ý * là phép nhân toán tử, không phải là phép nhân ma trận. Thay vào đó chúng ta sử dụng hàm dot để tính tích trong của 2 vector, nhân vector với ma trận, nhân ma trận với ma trận. dot có sẵn ở cả như một hàm củ numpy module hoặc là một instance method của tối tượng array. Ta có thể xem các ví dụ như sau:
Across specific axes of the ndarray:Có nhiều hàm hữu ích được tích hợp trong NumPy và thường chúng ta có thể thể hiện chúng qua các trục cụ thể của ndarray: Các trục với mảng 2 chiểu được thể hiện như trên.
Làm thế nào để chúng ta có thể chỉ ra chỉ số (index) của giá lớn nhát ở mỗi hàng ? Bạn có thể viết như sau:
Chúng ta có thể tìm thấy các chỉ số (index) của các phần tử thỏa mãn một số điều kiện nào đó bằng cách sử dụng np.where:
Lưu ý khi bạn áp dụng các thao tác sẽ loại bỏ chiểu củ nó ra khởi hình dạng (shape). Điều này rất hữu ích để ghi nhớ khi bạn đang cố gắng tìm trục nào tương ứng với cái gì. Ví dụ sau sử dụng hàm ndim chỉ số chiều của mảng.
TransposingNgoài việc tính toán các hàm toán học bằng cách sử dụng các mảng, chúng ta thường cần phải định hình lại hoặc thao tác dữ liệu trong các mảng. Ví dụ đơn giản nhất của loại hoạt động này là chuyển vị (transposing) ma trận; để hoán vị một ma trận, chỉ cần sử dụng thuộc tính T của một array object:
Bạn có thể tìm thấy danh sách đầy đủ các hàm toán học được cung cấp bởi numpy tại đây Vertical & Horizontal Stacking:Tiếp theo, nếu bạn muốn nối hai mảng và không chỉ thêm chúng, bạn có thể thực hiện nó bằng hai cách - xếp chồng dọc và xếp chồng ngang.
Và kết quả nó sẽ ra như sau:
Array indexingNumpy cung cấp một số cách để truy xuất phần tử trong mảng Slicing: Tương tự như list trong python, numpy arrays cũng có thể được cắt (sliced). Vì các mảng có thể là đa chiều, bạn phải chỉ định một lát cho mỗi chiều của mảng. Ví dụ.
Thông thường, thật hữu ích khi chọn hoặc sửa đổi một phần tử từ mỗi hàng của ma trận. Ví dụ sau sử dụng fancy indexing, trong đó chúng ta lập chỉ mục vào mảng của chúng tôi bằng cách sử dụng một mảng các chỉ số (giả sử một mảng các số nguyên hoặc booleans):
Boolean array indexing: Cho phép bạn chọn ra các phần tử tùy ý của một mảng, thường được sử dụng để chọn ra các phần tử thỏa mãn điều kiện nào đó. Ví dụ ta thay đổi giá trị các phần tử trong mảng lớn hơn MAX = 5 thành 1 số khác như 100
Hoặc ví dụ in ra các phần tử thỏa mãn điều kiện nào đó :
Nếu bạn muốn tìm hiều nhiều hơn về numpy array indexing bạn có thể tham khảo tại documentation broadcastingNhiều phép toán chúng ta đã xem xét ở trên là các mảng cùng rank. Tuy nhiên, nhiều lần chúng ta có thể có một mảng nhỏ hơn và sử dụng nhiều lần để cập nhật một mảng có kích thước lớn hơn. Ví dụ, hãy xem xét ví dụ dưới đây về việc dịch chuyển giá trị trung bình của mỗi cột từ các thành phần của cột tương ứng:
Hoặc như nhân một ma trân với 2:
Broadcasting 2 arrays với nhau tuân theo các quy luật sau:
Để cho dễ hiểu, thì khi thực hiện phép trừ cột ở trên, chúng ta có các mảng có shape (2,3) và (3,).
Bây giời, hãy thử trừ đi giá trị của mỗi hàng.
Khi bạn chạy nó sẽ báo lỗi. Để tìm ra lỗi ta thử in ra shape của 2 mảng.
Khi nhìn vào shape của 2 mảng, ta có thể tìm ra đáp vì sao chương trình của ta như sau: Nếu chúng ta tuân theo quy tắc 1 thì chúng ta sẽ bổ sung 1 cho mảng có rank nhỏ hơn và sẽ được mảng mới có shape là (1,2). Tuy nhiên chiều cuối cùng không khớp giữ (2,3) và (1,2), vi vậy 2 mảng trên không thể broadcast. Để cho chương trình như mong muốn, ra phải reshape lại row_means như sau:
Các hàm hỗ trợ broadcasting được gọi là universal functions. Bạn có thể tìm danh sách các hàm universal functions tại documentation Views vs. Copies (option)Không giống như copy, trong một view của một mảng, dữ liệu được chia sẻ giữa chế độ view và array. Đôi khi kết quả của chúng ta là bản sao của một mảng, nhưng lần khác chúng có thể là views. Hiểu khi nào chúng được tạo ra là một việc quan trọng để tránh các vấn đề bạn không thể lường trước được. Views có thể tạo từ slice của một mảng, thay đổi dtype của cùng một vùng dữ liệu (sử dụng arr.view(dtype), không phải kết quả của arr.astype(dtype)). Ta sẽ xem qua các ví dụ sau để có thể hiểu rõ về view hơn.
Tuy nhiên khi chúng ta sử dụng fancy indexing (được giới hiệu ở phần indexing bên trên) thì kết quả chắc chắn là một copy, không phải một view. Ví dụ 1:
Ví dụ 2:
SummaryNhững kiến thức trên mình thấy đó là những thứ cốt lõi nhất để bạn có thể hiểu và vận dụng chúng trong các trương trình. Nếu thấy hay thì bạn ngại gì mà không để lại 1 upvote để cho mình thêm động lực viết các bài tiếp theo . Nếu có bất kỳ thắc mắc nào bạn có thể comment bên dưới.References
|