2013-08-12 31 views
5

Tôi biết rằng there are differences between lists and tuplestuples aren't just constant lists, nhưng có một vài ví dụ về hai điều này thực sự được xử lý khác nhau theo mã (trái ngược với quy ước mã hóa), vì vậy tôi (sloppily) đã sử dụng chúng thay thế nhau.Danh sách và bộ xử lý hoạt động khác nhau

Sau đó, tôi tình cờ gặp một trường hợp họ đưa ra hành vi hoàn toàn khác nhau:

>>> import numpy as np 
>>> a = np.arange(9).reshape(3,3) 
>>> a 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 
>>> idx = (1,1) 
>>> a[idx] 
4 
>>> idx = [1,1] 
>>> a[idx] 
array([[3, 4, 5], 
     [3, 4, 5]]) 

ai đó có thể giải thích những gì đang xảy ra ở đây? Quan trọng hơn, nơi nào khác hiện tượng này xuất hiện trong scipy?

Trả lời

4

Bạn đang nhận được một hành vi khác nhau bởi vì, trong NumPy, ba loại chỉ mục được hỗ trợ

  • Basic Cắt lát
  • nâng cao Indexing
  • Ghi Truy cập

Sử dụng tuple cho chỉ mục là chỉ tương đương với một danh sách tham số, mà hậu tố như là một Slicing cơ bản, nơi-như bằng cách sử dụng một danh sách không giống như danh sách kết quả trong lập chỉ mục nâng cao.

Cũng nên nhớ, từ documentation

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 phi tuple, một ndarray (của kiểu dữ liệu số nguyên hoặc bool), hoặc một tuple với ít nhất một đối tượng chuỗi hoặc ndarray (của kiểu dữ liệu số nguyên hoặc bool). Có hai loại chỉ mục nâng cao: số nguyên và Boolean.

Lập chỉ mục nâng cao luôn trả về bản sao dữ liệu (tương phản với cắt cơ bản trả về một chế độ xem).

Và hơn nữa, từ cùng một tài liệu

Trong Python, x [(exp1, exp2, ..., EXPN)] tương đương với x [exp1, exp2, ..., expN]; sau này chỉ là cú pháp cú pháp cho cái cũ.

+0

+1 câu trả lời của bạn tốt hơn, vì vậy tôi xóa câu trả lời của mình. – defuz

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