2016-06-30 10 views
8

Tôi có xu hướng lập chỉ mục mảng cố định (ma trận) với dấu ngoặc vuông, nhưng tôi đã nhận thấy khi tôi muốn cắt mảng (ma trận), tôi phải sử dụng ký hiệu dấu phẩy. Tại sao điều này? Ví dụ,Tại sao lập chỉ mục các mảng có nhiều mảng với dấu ngoặc và dấu phẩy khác nhau về hành vi?

>>> x = numpy.array([[1, 2], [3, 4], [5, 6]]) 
>>> x 
array([[1, 2], 
     [3, 4], 
     [5, 6]]) 
>>> x[1][1] 
4     # expected behavior 
>>> x[1,1] 
4     # expected behavior 
>>> x[:][1] 
array([3, 4])  # huh? 
>>> x[:,1] 
array([2, 4, 6]) # expected behavior 
+1

Bạn cần hiểu những gì 'x [1]' hoặc 'x [:]' thực hiện trước khi hiểu 'x [1] [1]' hoặc 'x [:] [1]'. Hai dấu ngoặc kép được áp dụng tuần tự, với 2 cuộc gọi '__getitem__'. Nhưng trong 'x [:, 1]' cả hai trục được xem xét cùng nhau - bằng một cuộc gọi 'numpy'' __getitem__'. – hpaulj

+0

Cảm ơn bạn @hpaulj, đây là câu trả lời tôi đang tìm kiếm. – BoltzmannBrain

Trả lời

13

này:

x[:, 1] 

có nghĩa là "mất tất cả chỉ số của x dọc theo trục đầu tiên, nhưng chỉ chỉ số 1 dọc thứ hai".

này:

x[:][1] 

có nghĩa là "mất tất cả chỉ số của x dọc theo trục đầu tiên (vì vậy tất cả các x), sau đó đi chỉ số 1 dọc theo trục đầu tiên của kết quả". Bạn đang áp dụng 1 vào trục sai.

x[1][2]x[1, 2] chỉ là tương đương vì lập chỉ mục một mảng với một số nguyên chuyển tất cả các trục còn lại hướng về phía trước của hình dạng, vì vậy trục đầu tiên của x[1] là trục thứ hai của x. Điều này không khái quát chút nào; bạn hầu như luôn luôn nên sử dụng dấu phẩy thay vì nhiều bước lập chỉ mục.

1

Khi bạn trượt nhiều thứ nguyên của mảng, nếu ít chỉ mục được cung cấp hơn số trục, chỉ mục bị thiếu được coi là lát hoàn chỉnh. Do đó, khi bạn thực sự đang thực hiện khi gọi x[:][1]x[:,:][1,:] Do đó, x[:,:] sẽ chỉ trả về x chính nó.

Các vấn đề liên quan