Lập chỉ mục logic Python NumPy
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 Show
Ghi chú Hãy nhớ rằng một bộ cắt lát luôn có thể được xây dựng dưới dạng obj và được sử dụng trong ký hiệu x[obj] . Các đối tượng lát cắt có thể được sử dụng trong cấu trúc thay cho [start. dừng lại. bước] ký hiệu. Ví dụ: x[1. 10. 5,. -1] cũng có thể được triển khai dưới dạng obj = (slice(1 . Điều này có thể hữu ích để xây dựng mã chung hoạt động trên các mảng có kích thước tùy ý. slice(None,None,-1)); x[obj] . This can be useful for constructing generic code that works on arrays of arbitrary dimension. cục mịch. trục mớiĐối tượng có thể được sử dụng trong tất cả các thao tác cắt để tạo trục có độ dài một. . hăng sô. là bí danh cho 'Không' và 'Không' có thể được sử dụng thay cho điều này với kết quả tương tự Lập chỉ mục nâng caoLậ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 chuỗi không phải bộ, một (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 chuỗi 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 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 việc cắt cơ bản trả về một ) Cảnh báo Định nghĩa lập chỉ mục nâng cao có nghĩa là x[(1,2,3),] về cơ bản là khác với x[(1,2,3)]. The latter is equivalent to x[1,2,3] 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 lý do tại sao điều này xảy ra. Cũng nhận ra rằng x[[1,2,3]] sẽ kích hoạt lập chỉ mục nâng cao, trong khi x[[1,2,slice(None)]] will trigger basic slicing. Lập chỉ mục mảng số nguyênLậ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ỉ mục vào thứ nguyên đó Lập chỉ mục mảng số nguyên thuần túyKhi chỉ mục bao gồm nhiều mảng số nguyên như mảng được lập chỉ mục có kích thước, thì việc lập chỉ mục diễn ra đơn giản, nhưng khác với việc cắt Các chỉ mục nâng cao luôn tồn tại và được lặp lại như một result[i_1, ..., i_M] == x[ind_1[i_1, ..., i_M], ind_2[i_1, ..., i_M], ..., ind_N[i_1, ..., i_M]] Lưu ý rằng hình dạng kết quả giống với hình dạng mảng lập chỉ mục (phát sóng) ind_1, . , ind_N . Thí dụ Từ mỗi hàng, nên chọn một phần tử cụ thể. Chỉ số hàng chỉ là [0, 1, 2] và . 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. [0, 1, 0]. Using both together the task can be solved using advanced indexing: >>> x = np.array([[1, 2], [3, 4], [5, 6]]) >>> x[[0, 1, 2], [0, 1, 0]] array([1, 4, 5]) Để đạ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 này có thể trợ giúp với việc 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 thuộc về [0, 2] và hàng thuộc về [0, 3] need to be selected. To use advanced indexing one needs to select all elements explicitly. Using the method explained previously one could write: ________số 8_______ 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 thao tác như rows[. , np. newaxis] + columns ) để đơn giản hóa việc này. >>> rows = np.array([0, 3], dtype=np.intp) >>> columns = np.array([0, 2], dtype=np.intp) >>> rows[:, np.newaxis] array([[0], [3]]) >>> x[rows[:, np.newaxis], columns] array([[ 0, 2], [ 9, 11]]) 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[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])0 Lưu ý rằng không có np. ix_ , chỉ các phần tử đường chéo sẽ được chọn, như được sử dụng trong ví dụ trước. 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ỉ mục nâng cao. Kết hợp lập chỉ mục nâng cao và cơ bảnKhi có ít nhất một lát cắt ( . ), dấu chấm lửng ( . ) hoặc np. newaxis 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. 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, đó 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ể Thí dụ >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])1 Cách dễ nhất để hiểu tình huống 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 là (10,20,30) và ind là chỉ mục hình (2,3,4) . ,ind,. ] intp array, then result = x[...,ind,:] có hình dạng (10,2,3,4,30) vì không gian con hình (20,) đã được thay thế bằng không gian con lập chỉ mục quảng bá hình (2,3,4). Nếu chúng ta cho i, j, k lặp qua không gian con hình (2,3,4) thì kết quả [. ,i,j,k,. ] = x[. ,ind[i,j,k],. ] . Ví dụ này tạo ra kết quả tương tự như. Thí dụ Hãy x. hình là (10,20,30,40,50) và giả sử ind_1 và ind_2 can be broadcast to the shape (2,3,4). Then x[. ,ind_1,ind_2] có dạng (10,2,3,4,40,50) vì không gian con có dạng (20,30) từ X đã được thay thế bằng (2,3 . Tuy nhiên, x[. ,ind_1,. ,ind_2] có hình dạng (2,3,4,10,30,50) vì không có vị trí rõ ràng để thả 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 để 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. Lập chỉ mục mảng BooleanViệc 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ỉ mục boolean duy nhất thực tế giống với x[obj. nonzero()] trong đó, như được mô tả ở trên, trả về một bộ (có độ dài ) gồm các mảng chỉ số nguyên hiển thị True elements of obj. However, it is faster when obj. hình dạng == x. hình dạng . Nếu obj. ndim == x. ndim , x[obj] trả về mảng 1 chiều chứa đầy các phần tử của x tương ứng với True values of obj. The search order will be , C-style. If obj has True 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ì việc điền nó bằng False cũng giống như vậy. Thí dụ 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à NaN >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])2 Hoặc muốn thêm một hằng số cho tất cả các phần tử âm >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])3 Nói chung nếu một chỉ mục bao gồm một mảng Boolean, thì kết quả sẽ giống hệt với việc chèn obj. nonzero() 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[ind_1, boolean_array, ind_2] tương đương với x[(ind_1,) + boolean_array.nonzero() + (ind_2,)] . Nếu chỉ có một mảng Boolean và không có mảng lập chỉ mục số nguyên, thì đây là cách đơ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 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[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])4 Nhưng nếu rowsum cũng sẽ có hai chiều. >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])5 Cái cuối cùng chỉ cung cấp các phần tử đầu tiên do có thêm chiều. So sánh hàng. nonzero() để hiểu ví dụ này. 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. Hàm này cũng hỗ trợ các mảng boolean và sẽ hoạt động mà không có bất kỳ sự bất ngờ nào 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 này có thể được thực hiện với >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])6 Không có np. ix_ hoặc chỉ các phần tử đường chéo sẽ được chọn. Hoặc không có np. ix_ (so sánh các ví dụ về mảng số nguyên). >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])7 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ể)
Truy cập trườngXem thêm , Nếu đối tượng là một mảng có cấu trúc, 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['field-name'] trả về một giá trị mới cho mảng, có cùng hình dạng với x (ngoại trừ khi . dtype['field-name'] x.dtype['field-name'] và chỉ chứa một phần dữ liệu trong trường đã chỉ định. Ngoài ra, 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[['tên trường1','tên trường2']] . Hiện tại, điều này trả về một mảng mới chứa một bản sao của các giá trị trong các trường được chỉ định trong danh sách. Kể từ NumPy 1. 7, trả lại một bản sao không được dùng để trả lại một chế độ xem. Hiện tại, một bản sao sẽ tiếp tục được trả lại, nhưng Cảnh báo Tương lai sẽ được đưa ra khi ghi vào bản sao. Nếu bạn phụ thuộc vào hành vi hiện tại, thì chúng tôi khuyên bạn nên sao chép mảng được trả về một cách rõ ràng, tôi. e. sử dụng x[['tên trường1','tên trường2']]. sao chép(). Điều này sẽ hoạt động với cả phiên bản trước đây và tương lai của NumPy. 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ả Thí dụ >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])8 Lập chỉ mục Iterator phẳngtrả 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ỉ mục 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ế là một cái nhìn 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 có nghĩa là gì [. . ] có nghĩa là gì trên mảng NumPy?Các [. ,. ] là viết tắt của mọi thứ từ đầu đến cuối giống như danh sách. Sự khác biệt là lần đầu tiên. viết tắt của thứ nhất và thứ hai. cho chiều thứ hai. a = numpy.
Mảng NumPy có thể được lập chỉ mục không?Lập chỉ mục mảng cũng giống như truy cập phần tử mảng. Bạn có thể truy cập một phần tử mảng bằng cách tham khảo số chỉ mục của nó . Các chỉ mục trong mảng NumPy bắt đầu bằng 0, nghĩa là phần tử đầu tiên có chỉ số 0 và phần tử thứ hai có chỉ số 1, v.v.
có nghĩa là gì [. ] có nghĩa là gì trong mảng Python?Các [. ] tạo một bản sao nông của mảng , do đó cho phép bạn sửa đổi bản sao của mình mà không làm hỏng bản gốc. Lý do điều này cũng hoạt động đối với các chuỗi là trong Python, Chuỗi là các mảng byte đại diện cho các ký tự Unicode.
+= có hoạt động với mảng NumPy không?Mảng có nhiều mảng là các đối tượng có thể thay đổi được xác định rõ ràng trong các thao tác tại chỗ. Nếu a và b là các mảng có cùng hình dạng, thì a += b cộng hai mảng lại với nhau, sử dụng a làm bộ đệm đầu ra . |