Thao tác dữ liệu trong Python gần như đồng nghĩa với thao tác mảng NumPy. ngay cả những công cụ mới hơn như Pandas (Chương 3) cũng được xây dựng xung quanh mảng NumPy. Phần này sẽ trình bày một số ví dụ về việc sử dụng thao tác mảng NumPy để truy cập dữ liệu và các mảng con, đồng thời để phân tách, định hình lại và nối các mảng. Mặc dù các loại hoạt động được trình bày ở đây có vẻ hơi khô khan và mô phạm, nhưng chúng bao gồm các khối xây dựng của nhiều ví dụ khác được sử dụng xuyên suốt cuốn sách. Tìm hiểu kỹ về họ Show
Chúng tôi sẽ đề cập đến một số loại thao tác mảng cơ bản tại đây
Thuộc tính mảng NumPyTrước tiên hãy thảo luận về một số thuộc tính mảng hữu ích. Chúng ta sẽ bắt đầu bằng cách xác định ba mảng ngẫu nhiên, mảng một chiều, hai chiều và ba chiều. Chúng tôi sẽ sử dụng trình tạo số ngẫu nhiên của NumPy, chúng tôi sẽ tạo một giá trị đã đặt để đảm bảo rằng các mảng ngẫu nhiên giống nhau được tạo mỗi khi mã này được chạy Trong 1] import numpy as np np.random.seed(0) # seed for reproducibility x1 = np.random.randint(10, size=6) # One-dimensional array x2 = np.random.randint(10, size=(3, 4)) # Two-dimensional array x3 = np.random.randint(10, size=(3, 4, 5)) # Three-dimensional array Mỗi mảng có các thuộc tính print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)05 (số chiều), print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)06 (kích thước của mỗi chiều) và print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)07 (tổng kích thước của mảng) Trong 2] print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size) x3 ndim: 3 x3 shape: (3, 4, 5) x3 size: 60 Một thuộc tính hữu ích khác là print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)08, kiểu dữ liệu của mảng (mà chúng ta đã thảo luận trước đây trong Tìm hiểu các kiểu dữ liệu trong Python) Trong 3] print("dtype:", x3.dtype) ________số 8_______ Các thuộc tính khác bao gồm print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)09, liệt kê kích thước (tính bằng byte) của từng phần tử mảng và print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)10, liệt kê tổng kích thước (tính bằng byte) của mảng Trong [4] print("itemsize:", x3.itemsize, "bytes") print("nbytes:", x3.nbytes, "bytes") itemsize: 8 bytes nbytes: 480 bytes Nói chung, chúng ta kỳ vọng rằng print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)10 bằng với print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)09 nhân với print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)07 Lập chỉ mục mảng. Truy cập các phần tử đơn lẻNếu bạn đã quen với cách lập chỉ mục danh sách tiêu chuẩn của Python, thì việc lập chỉ mục trong NumPy sẽ khá quen thuộc. Trong mảng một chiều, giá trị $i^{th}$ (đếm từ 0) có thể được truy cập bằng cách chỉ định chỉ mục mong muốn trong dấu ngoặc vuông, giống như với danh sách Python Trong [5] x1
Ra[5] array([5, 0, 3, 3, 7, 9]) Trong [6] x1[0] Ra[6] print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)0 Trong [7] print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)1 Ra[7] print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)2 Để lập chỉ mục từ cuối mảng, bạn có thể sử dụng chỉ số âm Trong [8] print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)3 Ra[8] print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)4 Trong [9] print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)5 Ra[9] print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)2 Trong một mảng nhiều chiều, các mục có thể được truy cập bằng cách sử dụng bộ chỉ số được phân tách bằng dấu phẩy Trong [10] print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)7 Ra[10] print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)8 Trong [11] print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)9 Ra[11] x3 ndim: 3 x3 shape: (3, 4, 5) x3 size: 600 Trong [12] x3 ndim: 3 x3 shape: (3, 4, 5) x3 size: 601 Ra[12] x3 ndim: 3 x3 shape: (3, 4, 5) x3 size: 602 Trong [13] x3 ndim: 3 x3 shape: (3, 4, 5) x3 size: 603 Ra[13] print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)2 Các giá trị cũng có thể được sửa đổi bằng cách sử dụng bất kỳ ký hiệu chỉ mục nào ở trên Trong [14] x3 ndim: 3 x3 shape: (3, 4, 5) x3 size: 605 Ra[14] x3 ndim: 3 x3 shape: (3, 4, 5) x3 size: 606 Hãy nhớ rằng, không giống như danh sách Python, mảng NumPy có kiểu cố định. Điều này có nghĩa là, ví dụ, nếu bạn cố gắng chèn một giá trị dấu phẩy động vào một mảng số nguyên, thì giá trị đó sẽ bị cắt bớt một cách âm thầm. Đừng để bị bắt bởi hành vi này Trong [15] x3 ndim: 3 x3 shape: (3, 4, 5) x3 size: 607 Ra[15] x3 ndim: 3 x3 shape: (3, 4, 5) x3 size: 608 Cắt mảng. Truy cập các phân đoạnGiống như chúng ta có thể sử dụng dấu ngoặc vuông để truy cập các phần tử mảng riêng lẻ, chúng ta cũng có thể sử dụng chúng để truy cập các mảng con bằng ký hiệu lát cắt, được đánh dấu bằng ký tự dấu hai chấm ( print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)14). Cú pháp cắt NumPy tuân theo cú pháp của danh sách Python tiêu chuẩn; x3 ndim: 3 x3 shape: (3, 4, 5) x3 size: 609 Nếu bất kỳ giá trị nào trong số này không được chỉ định, chúng sẽ mặc định là các giá trị print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)16, print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)17 print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)18, print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)19. Chúng ta sẽ xem xét việc truy cập các mảng con trong một chiều và nhiều chiều Các mảng con một chiềuTrong [16] print("dtype:", x3.dtype)0 Ra[16] print("dtype:", x3.dtype)1 Trong [17] print("dtype:", x3.dtype)2 Ra[17] print("dtype:", x3.dtype)3 Trong [18] print("dtype:", x3.dtype)4 Hết[18] print("dtype:", x3.dtype)5 Trong 19] print("dtype:", x3.dtype)6 Hết[19] print("dtype:", x3.dtype)7 Trong 20] print("dtype:", x3.dtype)8 Hết[20] print("dtype:", x3.dtype)9 Trong [21] dtype: int640 Hết[21] dtype: int641 Một trường hợp có khả năng gây nhầm lẫn là khi giá trị print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)20 âm. Trong trường hợp này, giá trị mặc định cho print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)21 và print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)22 được hoán đổi. Điều này trở thành một cách thuận tiện để đảo ngược một mảng Trong [22] dtype: int642 Hết[22] dtype: int643 Trong [23] dtype: int644 Hết[23] dtype: int645 Phân vùng đa chiềuCác lát cắt đa chiều hoạt động theo cách tương tự, với nhiều lát cắt được phân tách bằng dấu phẩy. Ví dụ Trong [24] print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)7 Ra[24] x3 ndim: 3 x3 shape: (3, 4, 5) x3 size: 606 Trong [25] dtype: int648 Hết[25] dtype: int649 Trong [26] print("itemsize:", x3.itemsize, "bytes") print("nbytes:", x3.nbytes, "bytes")0 Hết[26] print("itemsize:", x3.itemsize, "bytes") print("nbytes:", x3.nbytes, "bytes")1 Cuối cùng, kích thước mảng con thậm chí có thể được đảo ngược lại với nhau Trong [27] print("itemsize:", x3.itemsize, "bytes") print("nbytes:", x3.nbytes, "bytes")2 Hết[27] print("itemsize:", x3.itemsize, "bytes") print("nbytes:", x3.nbytes, "bytes")3 Truy cập các hàng và cột của mảngMột thói quen thường cần thiết là truy cập các hàng hoặc cột đơn lẻ của một mảng. Điều này có thể được thực hiện bằng cách kết hợp lập chỉ mục và cắt lát, sử dụng một lát cắt trống được đánh dấu bằng một dấu hai chấm ( print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)14) Trong [28] print("itemsize:", x3.itemsize, "bytes") print("nbytes:", x3.nbytes, "bytes")4 print("itemsize:", x3.itemsize, "bytes") print("nbytes:", x3.nbytes, "bytes")5 Trong [29] print("itemsize:", x3.itemsize, "bytes") print("nbytes:", x3.nbytes, "bytes")6 print("itemsize:", x3.itemsize, "bytes") print("nbytes:", x3.nbytes, "bytes")7 Trong trường hợp truy cập hàng, lát cắt trống có thể được bỏ qua để có cú pháp gọn hơn Trong [30] print("itemsize:", x3.itemsize, "bytes") print("nbytes:", x3.nbytes, "bytes")8 print("itemsize:", x3.itemsize, "bytes") print("nbytes:", x3.nbytes, "bytes")7 Các mảng con dưới dạng chế độ xem không sao chépMột điều quan trọng và cực kỳ hữu ích cần biết về các lát mảng là chúng trả về dạng xem chứ không phải bản sao của dữ liệu mảng. Đây là một lĩnh vực trong đó việc cắt mảng NumPy khác với việc cắt danh sách Python. trong danh sách, các lát sẽ là bản sao. Hãy xem xét mảng hai chiều của chúng tôi từ trước Trong [31] itemsize: 8 bytes nbytes: 480 bytes0 itemsize: 8 bytes nbytes: 480 bytes1 Hãy trích xuất một mảng con $2 \times 2$ từ đây Trong [32] itemsize: 8 bytes nbytes: 480 bytes2 itemsize: 8 bytes nbytes: 480 bytes3 Bây giờ nếu chúng ta sửa đổi mảng con này, chúng ta sẽ thấy rằng mảng ban đầu đã bị thay đổi. Quan sát Trong [33] itemsize: 8 bytes nbytes: 480 bytes4 itemsize: 8 bytes nbytes: 480 bytes5 Trong [34] itemsize: 8 bytes nbytes: 480 bytes0 itemsize: 8 bytes nbytes: 480 bytes7 Hành vi mặc định này thực sự khá hữu ích. điều đó có nghĩa là khi chúng tôi làm việc với các bộ dữ liệu lớn, chúng tôi có thể truy cập và xử lý các phần của các bộ dữ liệu này mà không cần sao chép bộ đệm dữ liệu cơ bản Tạo bản sao của mảngMặc dù các tính năng hay của chế độ xem mảng, nhưng đôi khi sẽ hữu ích khi sao chép rõ ràng dữ liệu trong một mảng hoặc một mảng con. Điều này có thể được thực hiện dễ dàng nhất với phương pháp print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)24 Trong [35] itemsize: 8 bytes nbytes: 480 bytes8 itemsize: 8 bytes nbytes: 480 bytes5 Nếu bây giờ chúng ta sửa đổi mảng con này, mảng ban đầu sẽ không được chạm vào Trong [36] x1
0x1
1Trong [37] itemsize: 8 bytes nbytes: 480 bytes0 itemsize: 8 bytes nbytes: 480 bytes7 Định hình lại mảngMột loại hoạt động hữu ích khác là định hình lại mảng. Cách linh hoạt nhất để làm điều này là với phương pháp print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)25. Ví dụ: nếu bạn muốn đặt các số từ 1 đến 9 trong lưới $3 \times 3$, bạn có thể thực hiện như sau Trong [38] x1
4x1
5Lưu ý rằng để điều này hoạt động, kích thước của mảng ban đầu phải khớp với kích thước của mảng được định hình lại. Nếu có thể, phương thức print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)25 sẽ sử dụng chế độ xem không sao chép của mảng ban đầu, nhưng với bộ đệm bộ nhớ không liền kề thì điều này không phải lúc nào cũng đúng Một mẫu định hình lại phổ biến khác là chuyển đổi mảng một chiều thành ma trận hàng hoặc cột hai chiều. Điều này có thể được thực hiện bằng phương pháp print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)25 hoặc thực hiện dễ dàng hơn bằng cách sử dụng từ khóa print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)28 trong thao tác cắt lát Trong [39] x1
6Hết[39] x1
7Trong [40] x1
8Ra[40] x1
7Trong [41] array([5, 0, 3, 3, 7, 9])0 Ra[41] array([5, 0, 3, 3, 7, 9])1 Trong [42] array([5, 0, 3, 3, 7, 9])2 Ra[42] array([5, 0, 3, 3, 7, 9])1 Chúng ta sẽ thấy kiểu biến đổi này thường xuyên trong suốt phần còn lại của cuốn sách. Nối và tách mảngTất cả các thủ tục trước đó đều hoạt động trên các mảng đơn lẻ. Cũng có thể kết hợp nhiều mảng thành một và ngược lại chia một mảng thành nhiều mảng. Chúng ta sẽ xem xét các hoạt động đó ở đây nối các mảngViệc nối hoặc nối hai mảng trong NumPy chủ yếu được thực hiện bằng cách sử dụng các thủ tục print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)29, print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)30 và print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)31. print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)29 lấy một bộ hoặc danh sách các mảng làm đối số đầu tiên của nó, như chúng ta có thể thấy ở đây Trong [43] array([5, 0, 3, 3, 7, 9])4 Ra[43] array([5, 0, 3, 3, 7, 9])5 Bạn cũng có thể nối nhiều hơn hai mảng cùng một lúc Trong [44] array([5, 0, 3, 3, 7, 9])6 array([5, 0, 3, 3, 7, 9])7 Nó cũng có thể được sử dụng cho mảng hai chiều Trong [45] array([5, 0, 3, 3, 7, 9])8 Trong [46] array([5, 0, 3, 3, 7, 9])9 Ra[46] x1[0]0 Trong [47] x1[0]1 Ra[47] x1[0]2 Để làm việc với các mảng có kích thước hỗn hợp, có thể rõ ràng hơn khi sử dụng các hàm print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)30 (ngăn xếp dọc) và print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)31 (ngăn xếp ngang) Trong [48] x1[0]3 Ra[48] x1[0]4 Trong [49] x1[0]5 Ra[49] x1[0]6 Tương tự, print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)35 sẽ xếp các mảng dọc theo trục thứ ba Tách mảngNgược lại với nối là tách, được thực hiện bởi các hàm print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)36, print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)37 và print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)38. Đối với mỗi trong số này, chúng ta có thể chuyển một danh sách các chỉ số cho các điểm phân chia Trong [50] x1[0]7 x1[0]8 Lưu ý rằng N điểm phân tách dẫn đến N + 1 mảng con. Các chức năng liên quan print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)37 và print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size)38 là tương tự nhau NumPy có được cài đặt trong Python không?Nếu bạn đã cài đặt bản phân phối Anaconda của Python, NumPy sẽ được cài đặt sẵn và không cần thực hiện thêm bước cài đặt nào. Nếu bạn sử dụng phiên bản Python từ python. org hoặc phiên bản Python đi kèm với hệ điều hành của bạn, Anaconda Prompt và conda hoặc pip có thể được sử dụng để cài đặt NumPy.
Liệu Python 3. 9 bao gồm NumPy?Gói numpy chưa bao gồm các tệp nhị phân cho Python 3. 9 , vì vậy pip cố gắng biên dịch từ nguồn. Điều này (tất nhiên) yêu cầu bạn phải có trình biên dịch C thích hợp, như thông báo lỗi cho biết.
Python 3 có đi kèm với NumPy không?Trước khi có thể cài đặt NumPy, bạn cần biết mình có phiên bản Python nào. Ngôn ngữ lập trình này được cài đặt sẵn trên hầu hết các hệ điều hành (ngoại trừ Windows; bạn sẽ cần cài đặt Python trên Windows theo cách thủ công). Rất có thể bạn đã cài đặt Python 2 hoặc Python 3 hoặc thậm chí cả hai phiên bản .
NumPy có phải là thư viện trong Python không?NumPy (Numerical Python) là một thư viện mã nguồn mở Python được sử dụng trong hầu hết các lĩnh vực khoa học và kỹ thuật. Đó là tiêu chuẩn chung để làm việc với dữ liệu số trong Python và là cốt lõi của hệ sinh thái Python và PyData khoa học |