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

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ú pháp lát cắt cơ bản là

    >>> x[-2:10]
    array[[8, 9]]
    >>> x[-3:3:-1]
    array[[7, 6, 5, 4]]
    
    5 trong đó i là chỉ mục bắt đầu, j là chỉ mục dừng và k là bước [ \[k\neq0\]]. This selects the m elements [in the corresponding dimension] with index values i, i + k, …, i + [m - 1] k where \[m = q + [r\neq0 . j - i = q k + r sao cho i + [m - 1] k < j. Ví dụ. and q and r are the quotient and remainder obtained by dividing j - i by k: j - i = q k + r, so that i + [m - 1] k < j. For example:

    >>> 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. Từ ví dụ trên

    >>> 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à -n-1 cho k < 0. Nếu k không được cung cấp thì nó mặc định là 1. Lưu ý rằng

    >>> x[-2:10]
    array[[8, 9]]
    >>> x[-3:3:-1]
    array[[7, 6, 5, 4]]
    
    6 giống như
    >>> x[-2:10]
    array[[8, 9]]
    >>> x[-3:3:-1]
    array[[7, 6, 5, 4]]
    
    7 và có nghĩa là chọn tất cả các chỉ số dọc theo trục này. Từ ví dụ trên

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

  • Nếu số lượng đối tượng trong bộ lựa chọn nhỏ hơn N, thì

    >>> x[-2:10]
    array[[8, 9]]
    >>> x[-3:3:-1]
    array[[7, 6, 5, 4]]
    
    7 được giả định cho bất kỳ kích thước tiếp theo nào. Ví dụ

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

  • Một số nguyên i trả về các giá trị giống như

    >>> x[-2:10]
    array[[8, 9]]
    >>> x[-3:3:-1]
    array[[7, 6, 5, 4]]
    
    9 ngoại trừ số chiều của đối tượng được trả về bị giảm đi 1. Đặc biệt, một bộ lựa chọn với phần tử thứ p là một số nguyên [và tất cả các mục nhập khác
    >>> x[-2:10]
    array[[8, 9]]
    >>> x[-3:3:-1]
    array[[7, 6, 5, 4]]
    
    7] trả về mảng con tương ứng có kích thước N - 1. Nếu N = 1 thì đối tượng trả về là một mảng vô hướng. Những đối tượng này được giải thích trong Vô hướng .

  • Nếu bộ lựa chọn có tất cả các mục nhập

    >>> x[-2:10]
    array[[8, 9]]
    >>> x[-3:3:-1]
    array[[7, 6, 5, 4]]
    
    7 ngoại trừ mục nhập thứ p là một đối tượng lát cắt
    >>> x[-2:10]
    array[[8, 9]]
    >>> x[-3:3:-1]
    array[[7, 6, 5, 4]]
    
    5, thì mảng được trả về có thứ nguyên 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

  • Cắt lát cơ bản với nhiều hơn một mục nhập không phải ____97 trong bộ dữ liệu cắt lát, hoạt động giống như ứng dụng cắt lát lặp đi lặp lại bằng cách sử dụng một mục nhập không phải

    >>> x[-2:10]
    array[[8, 9]]
    >>> x[-3:3:-1]
    array[[7, 6, 5, 4]]
    
    7 duy nhất, trong đó các mục nhập không phải
    >>> x[-2:10]
    array[[8, 9]]
    >>> x[-3:3:-1]
    array[[7, 6, 5, 4]]
    
    7 được lấy liên tiếp [với tất cả các mục nhập không phải
    >>> x[-2:10]
    array[[8, 9]]
    >>> x[-3:3:-1]
    array[[7, 6, 5, 4]]
    
    7 khác được thay thế bằng
    >>> x[-2:10]
    array[[8, 9]]
    >>> x[-3:3:-1]
    array[[7, 6, 5, 4]]
    
    7]. Do đó,
    >>> x = np.array[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
    >>> x[1:7:2]
    array[[1, 3, 5]]
    
    98 hoạt động giống như
    >>> x = np.array[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
    >>> x[1:7:2]
    array[[1, 3, 5]]
    
    99 trong chế độ cắt lá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 = np.array[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
    >>> x[1:7:2]
    array[[1, 3, 5]]
    
    10 phải [có thể phát tới] cùng hình dạng với
    >>> x = np.array[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
    >>> x[1:7:2]
    array[[1, 3, 5]]
    
    6

  • 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 = np.array[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
    >>> x[1:7:2]
    array[[1, 3, 5]]
    
    6. Các đối tượng lát cắt có thể được sử dụng trong cấu trúc thay cho ký hiệu
    >>> x = np.array[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
    >>> x[1:7:2]
    array[[1, 3, 5]]
    
    13. Ví dụ:
    >>> x = np.array[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
    >>> x[1:7:2]
    array[[1, 3, 5]]
    
    14 cũng có thể được triển khai dưới dạng
    >>> x = np.array[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
    >>> x[1:7:2]
    array[[1, 3, 5]]
    
    15. Đ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 ý. Xem Xử lý số lượng chỉ số thay đổi trong chương trình để biết thêm thông tin.

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]
8
2

Điều này tương đương với

>>> x = np.arange[10]
>>> x[2]
2
>>> x[-2]
8
3

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]
8
22 và có thể sử dụng
>>> x = np.arange[10]
>>> x[2]
2
>>> x[-2]
8
22 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]
9
0

Đ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]
9
1

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]
8
24 [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]
8
25 về cơ bản khác với
>>> x = np.arange[10]
>>> x[2]
2
>>> x[-2]
8
26. Cái sau tương đương với
>>> x = np.arange[10]
>>> x[2]
2
>>> x[-2]
8
27 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]
9
2

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]
8
28 sẽ bị ném

>>> x.shape = [2, 5]  # now x is 2-dimensional
>>> x[1, 3]
8
>>> x[1, -1]
9
3

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]
9
4

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]
8
29. 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]
8
30 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]
9
5

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]
8
31. Giá trị tiếp theo là
>>> x = np.arange[10]
>>> x[2]
2
>>> x[-2]
8
32 và giá trị cuối cùng là
>>> x = np.arange[10]
>>> x[2]
2
>>> x[-2]
8
33

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]
9
6

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]
9
7

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]
9
8

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]
8
34 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]
8
35. 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]
9
9

Để đạ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]
8
36 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]
8
37 và hàng là một trong số
>>> x = np.arange[10]
>>> x[2]
2
>>> x[-2]
8
38 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]
8
39] để đơ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]
8
36

>>> 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]
9
01, 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]
9
02 trong đó, như được mô tả ở trên,
>>> x.shape = [2, 5]  # now x is 2-dimensional
>>> x[1, 3]
8
>>> x[1, -1]
9
03 trả về một bộ [có độ dài
>>> x.shape = [2, 5]  # now x is 2-dimensional
>>> x[1, 3]
8
>>> x[1, -1]
9
04] 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]
9
05 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]
9
06

Nếu

>>> x.shape = [2, 5]  # now x is 2-dimensional
>>> x[1, 3]
8
>>> x[1, -1]
9
07,
>>> 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]
9
05 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]
9
05 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]
9
11 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]
9
12

>>> 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]
9
03 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]
9
14 tương đương với
>>> x.shape = [2, 5]  # now x is 2-dimensional
>>> x[1, 3]
8
>>> x[1, -1]
9
15

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]
9
16, 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]
9
03. Hàm
>>> x = np.arange[10]
>>> x[2]
2
>>> x[-2]
8
36 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]
8
36, đ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]
9
01, 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]
9
01 [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]
2
0

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]
9
24] 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]
2
1

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]
2
2

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]
2
3

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ố

  • Các chỉ mục nâng cao được phân tách bằng một lát,

    >>> x[-2:10]
    array[[8, 9]]
    >>> x[-3:3:-1]
    array[[7, 6, 5, 4]]
    
    2 hoặc
    >>> x[-2:10]
    array[[8, 9]]
    >>> x[-3:3:-1]
    array[[7, 6, 5, 4]]
    
    3. Ví dụ
    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    28

  • Các chỉ số nâng cao đều nằm cạnh nhau. Ví dụ:

    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    29 nhưng không phải
    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    30 vì
    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    31 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 = [2, 5]  # now x is 2-dimensional
>>> x[1, 3]
8
>>> x[1, -1]
9
32 là [10, 20, 30] và
>>> x.shape = [2, 5]  # now x is 2-dimensional
>>> x[1, 3]
8
>>> x[1, -1]
9
33 là một mảng
>>> x.shape = [2, 5]  # now x is 2-dimensional
>>> x[1, 3]
8
>>> x[1, -1]
9
34 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]
9
35 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]
9
36. 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]
9
37

Thí dụ

Đặt

>>> x.shape = [2, 5]  # now x is 2-dimensional
>>> x[1, 3]
8
>>> x[1, -1]
9
32 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]
9
39 và
>>> x.shape = [2, 5]  # now x is 2-dimensional
>>> x[1, 3]
8
>>> x[1, -1]
9
40 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]
9
41 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]
9
42 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]
9
43 để 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]
9
44

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]
2
4

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]
8
24 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]
9
46 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]
9
48. 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]
2
5

Lập chỉ mục Iterator phẳng #

>>> x.shape = [2, 5]  # now x is 2-dimensional
>>> x[1, 3]
8
>>> x[1, -1]
9
49 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]
9
49 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]
2
6

hoặc một mảng có kích thước phù hợp

>>> x[0][2]
2
7

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]
2
8

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]
2
9

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]
9
51 được gán cho
>>> x.shape = [2, 5]  # now x is 2-dimensional
>>> x[1, 3]
8
>>> x[1, -1]
9
52 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]
9
53 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ể]

  • Kiểu lập chỉ mục gốc của NumPy là

    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    34 và có thể khác với kiểu mảng số nguyên mặc định.
    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    34 là kiểu 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 rỗng [tuple] là chỉ mục vô hướng đầy đủ trong một mảng không chiều.

    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    56 trả về một đại lượng vô hướng nếu
    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    57 là không có chiều và ngược lại là một dạng xem. Mặt khác,
    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    58 luôn trả về một lượt xem

  • Nếu một mảng không chiều có mặt trong chỉ mục và nó là một chỉ 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 [

    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    24] nhưng không có kích thước [i. e. thay thế số không
    >>> x[-2:10]
    array[[8, 9]]
    >>> x[-3:3:-1]
    array[[7, 6, 5, 4]]
    
    7] 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

    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    61 cho mảng Boolean không giữ cho 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 nhưng một chỉ mục riêng lẻ nằm ngoài giới hạn, thì việc

    >>> x = np.arange[10]
    >>> x[2]
    2
    >>> x[-2]
    8
    
    28 có được nâng lên hay không là không xác định [e. g.
    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    63 với
    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    64 nằm ngoài giới hạn]

  • 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 con thao túng hình dạng của nó], hành vi mặc định của

    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    65 sẽ gọi
    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    66 để 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 lớp con như vậy, tốt hơn nên gọi
    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    65 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
    >>> x.shape = [2, 5]  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    66 không trả lại lượt xem

    Giá trị K trong mảng là gì?

    K Giá trị Mạnh nhất trong Mảng trong C++ . Vì vậy, nếu đầu vào giống như arr = [1,2,3,4,5], k = 2, thì đầu ra sẽ là [5,1], điều này là do trung bình là . .

    Làm cách nào để sắp xếp k phần tử đầu tiên của một mảng theo thứ tự tăng dần và còn lại theo thứ tự giảm dần trong C?

    thuật toán. Lưu trữ k phần tử đầu tiên trong một mảng và sắp xếp theo thứ tự tăng dần. Lưu trữ n-k phần tử còn lại trong một mảng và sắp xếp theo thứ tự giảm dần. Hợp nhất hai mảng bằng cách thêm các phần tử từ mảng thứ hai theo thứ tự ngược lại

    Làm cách nào để sao chép tất cả các phần tử từ mảng này sang mảng khác trong Python?

    BƯỚC 1. Khai báo và khởi tạo mảng. BƯỚC 2. Khai báo một mảng khác có cùng kích thước với mảng đầu tiên. BƯỚC 3. Lặp qua mảng đầu tiên từ 0 đến độ dài của mảng và sao chép một phần tử từ mảng thứ nhất sang mảng thứ hai là mảng1[i] = mảng2[i]

    Độ phức tạp thời gian của thuật toán nhanh nhất để hợp nhất k mảng được sắp xếp có kích thước n là bao nhiêu?

    Phương pháp này mất O[N Log N] thời gian trong đó N là tổng số tất cả các phần tử. Một giải pháp hiệu quả là sử dụng cấu trúc dữ liệu heap. Độ phức tạp thời gian của giải pháp dựa trên heap là O[N Log k].

Chủ Đề