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

  • Cú pháp lát cắt cơ bản là i. j. k trong đó i là chỉ mục bắt đầu, j là chỉ mục dừng và k là bước (

    Lập chỉ mục logic Python NumPy
    ). Thao tác này chọn m phần tử (theo thứ nguyên tương ứng) với các giá trị chỉ số i, i + k,. , i + (m - 1) k trong đó
    Lập chỉ mục logic Python NumPy
    và q và r là thương và phần dư thu được bằng cách chia j - i cho k. j - i = q k + r sao cho i + (m - 1) k < j.

    Thí dụ

    >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> x[1:7:2]
    array([1, 3, 5])
    

  • Âm i và j được hiểu là n + i và n + j trong đó n là số phần tử trong chiều tương ứng. K âm làm cho bước tiến tới các chỉ số nhỏ hơn

    Thí dụ

    >>> x[-2:10]
    array([8, 9])
    >>> x[-3:3:-1]
    array([7, 6, 5, 4])
    

  • Giả sử n là số phần tử trong thứ nguyên được cắt. Sau đó, nếu tôi không được cung cấp, nó sẽ mặc định là 0 cho k > 0 và n - 1 cho k < 0. Nếu j không được cung cấp, nó sẽ mặc định là n cho k > 0 và -1 cho k < 0. Nếu k không được cung cấp thì nó mặc định là 1. Lưu ý rằng . cũng giống như . và có nghĩa là chọn tất cả các chỉ số dọc theo trục này.

    Thí dụ

    >>> x[5:]
    array([5, 6, 7, 8, 9])
    

  • Nếu số đối tượng trong bộ lựa chọn ít hơn N , thì . được giả định cho mọi thứ nguyên tiếp theo.

    Thí dụ

    >>> x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
    >>> x.shape
    (2, 3, 1)
    >>> x[1:2]
    array([[[4],
            [5],
            [6]]])
    

  • Dấu chấm lửng mở rộng đến số lượng . đối tượng cần thiết để tạo bộ lựa chọn có cùng độ dài với x. đim . Có thể chỉ có một dấu chấm lửng.

    Thí dụ

    >>> x[...,0]
    array([[1, 2, 3],
           [4, 5, 6]])
    

  • Mỗi đối tượng trong bộ dữ liệu 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 trong bộ lựa chọn

    Thí dụ

    >>> x[:,np.newaxis,:,:].shape
    (2, 1, 3, 1)
    

  • Một số nguyên i trả về các giá trị giống như i. i+1 ngoại trừ số chiều của đối tượng được trả về bị giảm đi 1. Cụ thể, một bộ lựa chọn có phần tử thứ p là một số nguyên (và tất cả các mục nhập khác . ) trả về mảng con tương ứng có thứ nguyên N - 1. Nếu N = 1 thì đối tượng trả về là một mảng vô hướng. Các đối tượng này được giải thích trong.

  • Nếu bộ lựa chọn có tất cả các mục . ngoại trừ mục thứ p là đối tượng lát cắt i. j. k , thì mảng được trả về có kích thước N được hình thành bằng cách nối các mảng con được trả về bằng cách lập chỉ mục số nguyên của các phần tử i, i+k,. , i + (m - 1) k < j,

  • Cắt lát cơ bản với nhiều hơn một loại không . mục nhập trong bộ dữ liệu cắt, hoạt động giống như ứng dụng cắt lặp đi lặp lại bằng cách sử dụng một mục không phải là . mục nhập, trong đó mục không- . mục được thực hiện liên tiếp (với tất cả các mục khác không phải . các mục được thay thế bằng . ). Do đó, x[ind1,. ,ind2,. ] hoạt động như x[ind1][. ,ind2,. ] trong chế độ cắt cơ bản.

    Cảnh báo

    Điều trên không đúng với lập chỉ mục nâng cao

  • Bạn có thể sử dụng phép cắt để đặt giá trị trong mảng, nhưng (không giống như danh sách), bạn không bao giờ có thể phát triển mảng. Kích thước của giá trị được đặt trong x[obj] = giá trị must be (broadcastable) to the same shape as x[obj].

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 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 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ê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ỉ mục vào thứ nguyên đó

Lập chỉ mục mảng số nguyên thuần túy

Khi 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ản

Khi 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ố

  • Các chỉ mục nâng cao được phân tách bằng một lát cắt, dấu chấm lửng hoặc trục mới. Ví dụ: x[arr1, . , arr2] .
  • Các chỉ mục nâng cao đều nằm cạnh nhau. Ví dụ x[. , mảng1, mảng2, . ] chứ không phải x[arr1, . , 1]1 là một chỉ số nâng cao về vấn đề này.

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_1ind_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 Boolean

Việ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ể)

  • Kiểu lập chỉ mục gốc của NumPy là intp và có thể khác với kiểu mảng số nguyên mặc định. intp là loại dữ liệu nhỏ nhất đủ để lập chỉ mục an toàn cho bất kỳ mảng nào; .
  • Đối với các bài tập nâng cao, nhìn chung không có gì đảm bảo cho thứ tự lặp lại. Điều này có nghĩa là nếu một phần tử được đặt nhiều lần thì không thể dự đoán kết quả cuối cùng
  • Chỉ mục (bộ) trống là chỉ mục vô hướng đầy đủ trong một mảng không chiều. x[()] trả về một đại lượng vô hướng nếu x là số không và . Mặt khác x[. ] luôn trả về một chế độ xem.
  • Nếu một mảng không chiều có mặt trong chỉ mục và nó là một chỉ mục số nguyên đầy đủ thì kết quả sẽ là một mảng vô hướng chứ không phải một mảng không chiều. (Chỉ mục nâng cao không được kích hoạt. )
  • Khi có dấu chấm lửng ( . ) có mặt nhưng không có kích thước (i. e. thay thế số không . ) thì kết quả vẫn luôn là một mảng. Một chế độ xem nếu không có chỉ mục nâng cao nào, nếu không thì một bản sao.
  • sự tương đương khác không đối với mảng Boolean không đúng đối với mảng boolean không chiều.
  • Khi kết quả của thao tác lập chỉ mục nâng cao không có phần tử nào ngoài một chỉ mục riêng lẻ nằm ngoài giới hạn, thì Lỗi chỉ mục có xuất hiện hay không . g. x[[], [123]] với 123 being out of bounds).
  • Khi xảy ra lỗi truyền trong khi gán (ví dụ: cập nhật một mảng số bằng cách sử dụng một chuỗi các chuỗi), mảng được gán có thể kết thúc ở trạng thái cập nhật một phần không thể đoán trước. Tuy nhiên, nếu xảy ra bất kỳ lỗi nào khác (chẳng hạn như chỉ số vượt quá giới hạn), mảng sẽ không thay đổi
  • Bố cục bộ nhớ của kết quả lập chỉ mục nâng cao được tối ưu hóa cho từng thao tác lập chỉ mục và không thể giả định thứ tự bộ nhớ cụ thể nào
  • Khi sử dụng một lớp con (đặc biệt là lớp điều khiển hình dạng của nó), ndarray mặc định. Hành vi __setitem__ sẽ gọi __getitem__ để lập chỉ mục cơ bản chứ không phải lập chỉ mục nâng cao. Đối với một phân lớp như vậy, tốt hơn nên gọi ndarray. __setitem__ với chế độ xem ndarray của lớp cơ sở trên dữ liệu. Điều này phải được thực hiện nếu các lớp con __getitem__ không trả lại lượt xem.

Truy cập trường

Xem 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ẳng

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ỉ 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 .