K mảng độc lập trong Python
>>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])4 có thể được lập chỉ mục bằng cách sử dụng cú pháp Python >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])6 tiêu chuẩn, trong đó x là mảng và obj là lựa chọn. Có nhiều loại lập chỉ mục khác nhau tùy thuộc vào obj. lập chỉ mục cơ bản, lập chỉ mục nâng cao và truy cập trường Show
Hầu hết các ví dụ sau đây cho thấy việc sử dụng lập chỉ mục khi tham chiếu dữ liệu trong một mảng. Các ví dụ cũng hoạt động tốt khi gán cho một mảng. Xem Gán giá trị cho mảng được lập chỉ mục để biết các ví dụ cụ thể và giải thích về cách hoạt động của phép gán. Lưu ý rằng trong Python, >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])7 tương đương với >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])8; Lập chỉ mục cơ bản #Lập chỉ mục phần tử đơn #Lập chỉ mục phần tử đơn hoạt động chính xác như vậy đối với các chuỗi Python tiêu chuẩn khác. Nó dựa trên 0 và chấp nhận các chỉ số âm để lập chỉ mục từ cuối mảng >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 8 Không cần thiết phải tách chỉ mục của từng thứ nguyên thành bộ dấu ngoặc vuông riêng >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 9 Lưu ý rằng nếu một người lập chỉ mục cho một mảng nhiều chiều có ít chỉ số hơn số chiều, thì người đó sẽ nhận được một mảng chiều con. Ví dụ >>> x[0] array([0, 1, 2, 3, 4]) Tức là, mỗi chỉ mục được chỉ định sẽ chọn mảng tương ứng với phần còn lại của các thứ nguyên được chọn. Trong ví dụ trên, chọn 0 có nghĩa là kích thước còn lại của độ dài 5 không được chỉ định và những gì được trả về là một mảng có kích thước và kích thước đó. Cần lưu ý rằng mảng trả về là một view , i. e. , nó không phải là bản sao của bản gốc, nhưng trỏ đến cùng các giá trị trong bộ nhớ giống như mảng ban đầu. Trong trường hợp này, mảng 1-D ở vị trí đầu tiên (0) được trả về. Vì vậy, sử dụng một chỉ mục duy nhất trên mảng được trả về, dẫn đến một phần tử duy nhất được trả về. Đó là. >>> x[0][2] 2 Vì vậy, lưu ý rằng >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])9 mặc dù trường hợp thứ hai kém hiệu quả hơn vì một mảng tạm thời mới được tạo sau chỉ mục đầu tiên mà sau đó được lập chỉ mục bởi 2 Ghi chú NumPy sử dụng lập chỉ mục theo thứ tự C. Điều đó có nghĩa là chỉ mục cuối cùng thường đại diện cho vị trí bộ nhớ thay đổi nhanh nhất, không giống như Fortran hoặc IDL, nơi chỉ mục đầu tiên đại diện cho vị trí thay đổi nhanh nhất trong bộ nhớ. Sự khác biệt này thể hiện khả năng nhầm lẫn lớn cắt lát và sải bước #Cắt lát cơ bản mở rộng khái niệm cắt lát cơ bản của Python thành N kích thước. Cắt cơ bản xảy ra khi obj là một đối tượng >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])0 (được xây dựng bởi ký hiệu >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])1 bên trong dấu ngoặc), một số nguyên hoặc một bộ gồm các đối tượng lát và số nguyên. Các đối tượng >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])2 và >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])3 cũng có thể được xen kẽ với các đối tượng này Trường hợp lập chỉ mục đơn giản nhất với N số nguyên trả về một mảng vô hướng đại diện cho mục tương ứng. Như trong Python, tất cả các chỉ số đều dựa trên số không. đối với chỉ mục thứ i \(n_i\) , phạm vi hợp lệ là \(0 \le n_i < . Chỉ số âm được hiểu là đếm từ cuối mảng (i. e. , nếu where \(d_i\) is the i-th element of the shape of the array. Negative indices are interpreted as counting from the end of the array (i.e., if \(n_i < 0\) , điều đó có nghĩa là \(n_i + d_i\)). Tất cả các mảng được tạo bằng cách cắt cơ bản luôn là lượt xem của mảng ban đầu. Ghi chú Việc cắt NumPy tạo ra một chế độ xem thay vì một bản sao như trong trường hợp các chuỗi Python tích hợp sẵn như chuỗi, bộ và danh sách. Phải cẩn thận khi trích xuất một phần nhỏ từ một mảng lớn, phần này trở nên vô dụng sau khi trích xuất, bởi vì phần nhỏ được trích xuất chứa tham chiếu đến mảng lớn ban đầu mà bộ nhớ của nó sẽ không được giải phóng cho đến khi tất cả các mảng dẫn xuất từ nó được thu gom rác. Trong những trường hợp như vậy, nên sử dụng >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])4 rõ ràng. Các quy tắc tiêu chuẩn của việc cắt chuỗi áp dụng cho việc cắt cơ bản trên cơ sở mỗi thứ nguyên (bao gồm cả việc sử dụng chỉ mục bước). Một số khái niệm hữu ích cần nhớ bao gồm
Công cụ lập chỉ mục thứ nguyên #Có một số công cụ để tạo điều kiện dễ dàng kết hợp các hình dạng mảng với các biểu thức và trong các bài tập >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])2 mở rộng đến số lượng đối tượng >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])7 cần thiết để bộ lựa chọn lập chỉ mục cho tất cả các thứ nguyên. Trong hầu hết các trường hợp, điều này có nghĩa là độ dài của bộ lựa chọn mở rộng là >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])18. Có thể chỉ có một dấu chấm lửng. Từ ví dụ trên >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 82 Điều này tương đương với >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 83 Mỗi đối tượng >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])3 trong bộ lựa chọn phục vụ để mở rộng kích thước của lựa chọn kết quả theo một kích thước độ dài đơn vị. Kích thước được thêm vào là vị trí của đối tượng >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])3 trong bộ lựa chọn. >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])3 là bí danh của >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 822 và có thể sử dụng >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 822 thay cho bí danh này với kết quả tương tự. Từ ví dụ trên >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 90 Điều này có thể hữu ích để kết hợp hai mảng theo cách mà nếu không sẽ yêu cầu các hoạt động định hình lại rõ ràng. Ví dụ >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 91 Lập chỉ mục nâng cao#Lập chỉ mục nâng cao được kích hoạt khi đối tượng lựa chọn, obj, là một đối tượng trình tự không phải bộ, một >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 824 (kiểu dữ liệu số nguyên hoặc bool) hoặc một bộ có ít nhất một đối tượng trình tự hoặc ndarray (kiểu dữ liệu số nguyên hoặc bool). Có hai loại lập chỉ mục nâng cao. số nguyên và Boolean Tính năng lập chỉ mục nâng cao luôn trả về một bản sao của dữ liệu (ngược lại với tính năng cắt cơ bản trả về một chế độ xem ). Cảnh báo Định nghĩa về lập chỉ mục nâng cao có nghĩa là >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 825 về cơ bản khác với >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 826. Cái sau tương đương với >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 827 sẽ kích hoạt lựa chọn cơ bản trong khi cái trước sẽ kích hoạt lập chỉ mục nâng cao. Hãy chắc chắn để hiểu tại sao điều này xảy ra Lập chỉ mục mảng số nguyên #Lập chỉ mục mảng số nguyên cho phép lựa chọn các mục tùy ý trong mảng dựa trên chỉ mục N chiều của chúng. Mỗi mảng số nguyên đại diện cho một số chỉ số vào thứ nguyên đó Các giá trị âm được cho phép trong các mảng chỉ mục và hoạt động như với các chỉ mục hoặc lát cắt đơn lẻ >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 92 Nếu các giá trị chỉ mục nằm ngoài giới hạn thì một >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 828 sẽ bị ném >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 93 Khi chỉ mục bao gồm nhiều mảng số nguyên như kích thước của mảng được lập chỉ mục, việc lập chỉ mục sẽ đơn giản, nhưng khác với việc cắt Các chỉ mục nâng cao luôn được phát và lặp lại thành một. >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 94 Lưu ý rằng hình dạng kết quả giống hệt với hình dạng mảng lập chỉ mục (phát sóng) >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 829. Nếu các chỉ số không thể được phát thành cùng một hình dạng, một ngoại lệ >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 830 sẽ được đưa ra Lập chỉ mục với các mảng chỉ mục đa chiều có xu hướng sử dụng bất thường hơn, nhưng chúng được cho phép và chúng hữu ích cho một số vấn đề. Chúng ta sẽ bắt đầu với trường hợp đa chiều đơn giản nhất >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 95 Trong trường hợp này, nếu các mảng chỉ mục có hình dạng phù hợp và có một mảng chỉ mục cho mỗi chiều của mảng được lập chỉ mục, thì mảng kết quả có cùng hình dạng với các mảng chỉ mục và các giá trị tương ứng với chỉ mục được đặt cho mỗi chiều. . Trong ví dụ này, giá trị chỉ mục đầu tiên là 0 cho cả hai mảng chỉ mục và do đó, giá trị đầu tiên của mảng kết quả là >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 831. Giá trị tiếp theo là >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 832 và giá trị cuối cùng là >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 833 Nếu các mảng chỉ mục không có hình dạng giống nhau, sẽ có một nỗ lực phát chúng thành cùng một hình dạng. Nếu chúng không thể được phát đến cùng một hình dạng, một ngoại lệ sẽ được đưa ra >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 96 Cơ chế quảng bá cho phép mảng chỉ số được kết hợp với vô hướng cho các chỉ số khác. Hiệu quả là giá trị vô hướng được sử dụng cho tất cả các giá trị tương ứng của các mảng chỉ số >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 97 Chuyển sang cấp độ phức tạp tiếp theo, chỉ có thể lập chỉ mục một phần mảng với mảng chỉ mục. Phải suy nghĩ một chút để hiểu điều gì xảy ra trong những trường hợp như vậy. Ví dụ: nếu chúng ta chỉ sử dụng một mảng chỉ mục với y >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 98 Nó dẫn đến việc xây dựng một mảng mới trong đó mỗi giá trị của mảng chỉ mục chọn một hàng từ mảng được lập chỉ mục và mảng kết quả có hình dạng kết quả (số phần tử chỉ mục, kích thước của hàng) Nói chung, hình dạng của mảng kết quả sẽ là sự kết hợp của hình dạng của mảng chỉ mục (hoặc hình dạng mà tất cả các mảng chỉ mục được phát tới) với hình dạng của bất kỳ kích thước không sử dụng nào (những thứ không được lập chỉ mục) trong mảng được lập chỉ mục Thí dụ Từ mỗi hàng, một phần tử cụ thể sẽ được chọn. Chỉ mục hàng chỉ là >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 834 và chỉ mục cột chỉ định phần tử để chọn cho hàng tương ứng, ở đây là >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 835. Sử dụng cả hai tác vụ cùng nhau có thể được giải quyết bằng cách sử dụng lập chỉ mục nâng cao >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 99 Để đạt được một hành vi tương tự như cắt cơ bản ở trên, có thể sử dụng phát sóng. Chức năng >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 836 có thể giúp phát sóng này. Điều này được hiểu rõ nhất với một ví dụ Thí dụ Từ mảng 4x3, các phần tử góc phải được chọn bằng lập chỉ mục nâng cao. Do đó, tất cả các phần tử mà cột là một trong số >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 837 và hàng là một trong số >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 838 cần phải được chọn. Để sử dụng lập chỉ mục nâng cao, người ta cần chọn tất cả các phần tử một cách rõ ràng. Sử dụng phương pháp được giải thích trước đây, người ta có thể viết >>> x[0] array([0, 1, 2, 3, 4])0 Tuy nhiên, vì các mảng lập chỉ mục ở trên chỉ lặp lại chính chúng, nên có thể sử dụng quảng bá (so sánh các hoạt động như >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 839) để đơn giản hóa việc này >>> x[0] array([0, 1, 2, 3, 4])1 Việc phát sóng này cũng có thể đạt được bằng cách sử dụng chức năng >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 836 >>> x[0] array([0, 1, 2, 3, 4])2 Lưu ý rằng nếu không có lệnh gọi >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 901, thì chỉ các phần tử đường chéo sẽ được chọn >>> x[0] array([0, 1, 2, 3, 4])3 Sự khác biệt này là điều quan trọng nhất cần nhớ về lập chỉ mục với nhiều chỉ số nâng cao Thí dụ Một ví dụ thực tế về nơi lập chỉ mục nâng cao có thể hữu ích là đối với bảng tra cứu màu nơi chúng tôi muốn ánh xạ các giá trị của hình ảnh thành bộ ba RGB để hiển thị. Bảng tra cứu có thể có hình dạng (nlookup, 3). Lập chỉ mục một mảng như vậy với một hình ảnh có hình dạng (ny, nx) với dtype=np. uint8 (hoặc bất kỳ loại số nguyên nào miễn là các giá trị nằm trong giới hạn của bảng tra cứu) sẽ dẫn đến một mảng hình dạng (ny, nx, 3) trong đó bộ ba giá trị RGB được liên kết với mỗi vị trí pixel Lập chỉ mục mảng Boolean#Lập chỉ mục nâng cao này xảy ra khi obj là một đối tượng mảng kiểu Boolean, chẳng hạn như có thể được trả về từ các toán tử so sánh. Một mảng chỉ số boolean duy nhất thực tế giống hệt với >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 902 trong đó, như được mô tả ở trên, >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 903 trả về một bộ (có độ dài >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 904) gồm các mảng chỉ mục số nguyên hiển thị các phần tử >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 905 của obj. Tuy nhiên, nó nhanh hơn khi >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 906 Nếu >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 907, >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])6 trả về mảng 1 chiều chứa đầy các phần tử của x tương ứng với giá trị >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 905 của obj. Thứ tự tìm kiếm sẽ là row-major , kiểu C. Nếu obj có giá trị >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 905 tại các mục nằm ngoài giới hạn của x, thì lỗi chỉ mục sẽ xuất hiện. Nếu obj nhỏ hơn x thì điền nó bằng >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 911 cũng giống như vậy. Một trường hợp sử dụng phổ biến cho việc này là lọc các giá trị phần tử mong muốn. Ví dụ: người ta có thể muốn chọn tất cả các mục từ một mảng không phải là >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 912 >>> x[0] array([0, 1, 2, 3, 4])4 Hoặc muốn thêm một hằng số cho tất cả các phần tử âm >>> x[0] array([0, 1, 2, 3, 4])5 Nói chung, nếu một chỉ mục bao gồm một mảng Boolean, kết quả sẽ giống với việc chèn >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 903 vào cùng một vị trí và sử dụng cơ chế lập chỉ mục mảng số nguyên được mô tả ở trên. >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 914 tương đương với >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 915 Nếu chỉ có một mảng Boolean và không có mảng lập chỉ mục số nguyên, điều này rất đơn giản. Chỉ cần cẩn thận để đảm bảo rằng chỉ mục boolean có chính xác số thứ nguyên mà nó được cho là hoạt động với Nói chung, khi mảng boolean có ít kích thước hơn mảng được lập chỉ mục, điều này tương đương với >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 916, có nghĩa là x được lập chỉ mục bởi b theo sau là bao nhiêu >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])7 cần thiết để điền vào thứ hạng của x. Do đó, hình dạng của kết quả là một chiều chứa số phần tử True của mảng boolean, tiếp theo là các chiều còn lại của mảng được lập chỉ mục >>> x[0] array([0, 1, 2, 3, 4])6 Ở đây, hàng thứ 4 và thứ 5 được chọn từ mảng được lập chỉ mục và được kết hợp để tạo thành mảng 2 chiều Thí dụ Từ một mảng, chọn tất cả các hàng có tổng nhỏ hơn hoặc bằng hai >>> x[0] array([0, 1, 2, 3, 4])7 Kết hợp nhiều mảng lập chỉ mục Boolean hoặc một Boolean với một mảng lập chỉ mục số nguyên có thể được hiểu tốt nhất bằng phép loại suy >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 903. Hàm >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 836 cũng hỗ trợ mảng boolean và sẽ hoạt động bình thường Thí dụ Sử dụng lập chỉ mục boolean để chọn tất cả các hàng cộng với một số chẵn. Đồng thời, các cột 0 và 2 nên được chọn với chỉ mục số nguyên nâng cao. Sử dụng chức năng >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 836, điều này có thể được thực hiện với >>> x[0] array([0, 1, 2, 3, 4])8 Nếu không có lệnh gọi >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 901, chỉ các phần tử đường chéo sẽ được chọn Hoặc không có >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 901 (so sánh các ví dụ về mảng số nguyên) >>> x[0] array([0, 1, 2, 3, 4])9 Thí dụ Sử dụng mảng boolean 2-D có hình (2, 3) với bốn phần tử True để chọn các hàng từ mảng 3-D có hình (2, 3, 5) dẫn đến kết quả 2-D có hình (4, 5) >>> x[0][2] 20 Kết hợp lập chỉ mục nâng cao và cơ bản#Khi có ít nhất một lát cắt ( >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])7), dấu chấm lửng ( >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 924) hoặc >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])3 trong chỉ mục (hoặc mảng có nhiều thứ nguyên hơn so với chỉ mục nâng cao), thì hành vi có thể phức tạp hơn. Nó giống như nối kết quả lập chỉ mục cho từng phần tử chỉ mục nâng cao Trong trường hợp đơn giản nhất, chỉ có một chỉ mục nâng cao duy nhất kết hợp với một lát cắt. Ví dụ >>> x[0][2] 21 Trên thực tế, hoạt động của mảng lát và chỉ mục là độc lập. Thao tác cắt lát trích xuất các cột có chỉ số 1 và 2, (i. e. cột thứ 2 và thứ 3), tiếp theo là thao tác mảng chỉ mục trích xuất các hàng có chỉ số 0, 2 và 4 (i. e hàng thứ nhất, thứ ba và thứ năm). Điều này tương đương với >>> x[0][2] 22 Ví dụ, một chỉ mục nâng cao duy nhất có thể thay thế một lát cắt và mảng kết quả sẽ giống nhau. Tuy nhiên, nó là một bản sao và có thể có cách bố trí bộ nhớ khác. Một lát là tốt hơn khi nó có thể. Ví dụ >>> x[0][2] 23 Cách dễ nhất để hiểu sự kết hợp của nhiều chỉ số nâng cao có thể là suy nghĩ về hình dạng kết quả. Có hai phần đối với thao tác lập chỉ mục, không gian con được xác định bởi chỉ mục cơ bản (không bao gồm số nguyên) và không gian con từ phần lập chỉ mục nâng cao. Cần phân biệt hai trường hợp kết hợp chỉ số
Trong trường hợp đầu tiên, các kích thước do hoạt động lập chỉ mục nâng cao xuất hiện đầu tiên trong mảng kết quả và các kích thước không gian con sau đó. Trong trường hợp thứ hai, các thứ nguyên từ các hoạt động lập chỉ mục nâng cao được chèn vào mảng kết quả tại cùng một vị trí như trong mảng ban đầu (logic sau là thứ làm cho việc lập chỉ mục nâng cao đơn giản hoạt động giống như cắt) Thí dụ Giả sử >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 932 là (10, 20, 30) và >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 933 là một mảng >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 934 lập chỉ mục hình (2, 3, 4), thì >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 935 có hình (10, 2, 3, 4, 30) vì mảng (20,) hình . Nếu chúng ta cho i, j, k lặp qua không gian con hình (2, 3, 4) thì >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 936. Ví dụ này tạo ra kết quả tương tự như >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 937 Thí dụ Đặt >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 932 là (10, 20, 30, 40, 50) và giả sử >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 939 và >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 940 có thể được phát thành hình dạng (2, 3, 4). Khi đó >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 941 có dạng (10, 2, 3, 4, 40, 50) vì không gian con hình (20, 30) từ X đã được thay thế bằng không gian con (2, 3, 4) từ các chỉ số. Tuy nhiên, >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 942 có dạng (2, 3, 4, 10, 30, 50) vì không có vị trí rõ ràng để bỏ vào không gian con lập chỉ mục, do đó nó được thêm vào từ đầu. Luôn có thể sử dụng >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 943 để di chuyển không gian con đến bất kỳ đâu mong muốn. Lưu ý rằng ví dụ này không thể được sao chép bằng cách sử dụng >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 944 Thí dụ Cắt lát có thể được kết hợp với các chỉ số boolean được phát sóng >>> x[0][2] 24 Truy cập trường #Xem thêm Mảng có cấu trúc Nếu đối tượng >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 824 là một mảng có cấu trúc thì các trường của mảng có thể được truy cập bằng cách lập chỉ mục mảng bằng các chuỗi, giống như từ điển. Lập chỉ mục >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 946 trả về một chế độ xem mới cho mảng, có cùng hình dạng với x (ngoại trừ khi trường là một phụ . Ngoài ra, mảng bản ghi vô hướng có thể được "lập chỉ mục" theo cách này. Việc lập chỉ mục vào một mảng có cấu trúc cũng có thể được thực hiện với một danh sách các tên trường, e. g. >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 948. Kể từ NumPy 1. 16, điều này trả về một dạng xem chỉ chứa các trường đó. Trong các phiên bản cũ hơn của NumPy, nó trả về một bản sao. Xem phần hướng dẫn sử dụng trên Mảng có cấu trúc để biết thêm thông tin về lập chỉ mục đa trường. Nếu trường được truy cập là một mảng con, kích thước của mảng con được thêm vào hình dạng của kết quả. Ví dụ >>> x[0][2] 25 Lập chỉ mục Iterator phẳng #>>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 949 trả về một trình vòng lặp sẽ lặp lại trên toàn bộ mảng (theo kiểu liền kề C với chỉ số cuối cùng thay đổi nhanh nhất). Đối tượng trình vòng lặp này cũng có thể được lập chỉ mục bằng cách sử dụng tính năng cắt cơ bản hoặc lập chỉ mục nâng cao miễn là đối tượng lựa chọn không phải là một bộ. Điều này nên rõ ràng từ thực tế rằng >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 949 là chế độ xem 1 chiều. Nó có thể được sử dụng để lập chỉ mục số nguyên với các chỉ số phẳng kiểu C 1 chiều. Do đó, hình dạng của bất kỳ mảng nào được trả về là hình dạng của đối tượng lập chỉ mục số nguyên Gán giá trị cho mảng được lập chỉ mục#Như đã đề cập, người ta có thể chọn một tập hợp con của một mảng để gán cho việc sử dụng một mảng chỉ mục, lát và chỉ mục và mặt nạ. Giá trị được gán cho mảng được lập chỉ mục phải có hình dạng nhất quán (cùng hình dạng hoặc có thể phát rộng với hình dạng mà chỉ mục tạo ra). Ví dụ, nó được phép gán một hằng số cho một lát cắt >>> x[0][2] 26 hoặc một mảng có kích thước phù hợp >>> x[0][2] 27 Lưu ý rằng phép gán có thể dẫn đến thay đổi nếu gán loại cao hơn cho loại thấp hơn (như số float cho int) hoặc thậm chí là ngoại lệ (gán phức hợp cho số float hoặc int) >>> x[0][2] 28 Không giống như một số tham chiếu (chẳng hạn như chỉ số mảng và mặt nạ), các phép gán luôn được thực hiện cho dữ liệu gốc trong mảng (thực sự, không có gì khác có ý nghĩa. ). Tuy nhiên, xin lưu ý rằng một số hành động có thể không hoạt động như người ta có thể mong đợi một cách ngây thơ. Ví dụ cụ thể này thường gây ngạc nhiên cho mọi người >>> x[0][2] 29 Nơi mọi người mong đợi rằng vị trí đầu tiên sẽ được tăng thêm 3. Trên thực tế, nó sẽ chỉ được tăng thêm 1. Lý do là một mảng mới được trích xuất từ mảng ban đầu (dưới dạng tạm thời) chứa các giá trị tại 1, 1, 3, 1, sau đó giá trị 1 được thêm vào tạm thời và sau đó tạm thời được gán lại cho mảng ban đầu. Do đó, giá trị của mảng tại >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 951 được gán cho >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 952 ba lần, thay vì được tăng lên 3 lần Xử lý số lượng chỉ số thay đổi trong chương trình#Cú pháp lập chỉ mục rất mạnh nhưng hạn chế khi xử lý một số lượng chỉ mục khác nhau. Ví dụ: nếu bạn muốn viết một hàm có thể xử lý các đối số với nhiều kích thước khác nhau mà không cần phải viết mã trường hợp đặc biệt cho từng số kích thước có thể, thì làm thế nào để thực hiện điều đó? . Ví dụ >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])0 Vì vậy, người ta có thể sử dụng mã để xây dựng các bộ dữ liệu của bất kỳ số lượng chỉ mục nào và sau đó sử dụng chúng trong một chỉ mục Các lát có thể được chỉ định trong các chương trình bằng cách sử dụng hàm slice() trong Python. Ví dụ >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])1 Tương tự như vậy, dấu chấm lửng có thể được chỉ định bằng mã bằng cách sử dụng đối tượng Ellipsis >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])2 Vì lý do này, có thể sử dụng trực tiếp đầu ra từ hàm >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 953 làm chỉ mục vì nó luôn trả về một bộ các mảng chỉ mục Do cách xử lý đặc biệt của các bộ dữ liệu, chúng không tự động được chuyển đổi thành một mảng như một danh sách. như một ví dụ >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])3 Ghi chú chi tiết#Đây là một số ghi chú chi tiết, không quan trọng đối với việc lập chỉ mục hàng ngày (không theo thứ tự cụ thể)
|