2011-08-11 88 views
6

Tôi mới làm quen với python và tôi muốn hiểu cách người ta thao tác các phần tử của một mảng. Nếu tôi có ví dụ:cách truy cập các phần tử trong một mảng 2D?

a= (a11 a12 a13) and b = (b11 b12 b13) 
    a21 a22 a23    b21 b22 b23 

tôi đã xác định chúng trong python như ví dụ:

a=[[1,1],[2,1],[3,1]] 
b=[[1,2],[2,2],[3,2]] 

tôi thấy rằng tôi không thể đề cập đến a[1][1] nhưng để a[1] mà mang lại cho tôi một kết quả của [2,1]. Vì vậy, tôi không hiểu làm cách nào để truy cập hàng thứ hai của các mảng này? Đó có thể là a21, a22, a23, b21, b22, b23? Và làm thế nào tôi sẽ làm để nhân chúng như c1 = a21*b21, c2 = a22*b22, vv?

+1

tốt nhất để bắt đầu sử dụng gọn gàng ngay bây giờ! –

+2

Bạn có gặp lỗi khi cố gắng đánh giá 'a [1] [1]'? Điều đó hóa ra là 1. Bạn đã tìm thấy gì? –

Trả lời

6

Nếu bạn có

a=[[1,1],[2,1],[3,1]] 
b=[[1,2],[2,2],[3,2]] 

Sau đó

a[1][1] 

sẽ hoạt động tốt. Nó chỉ vào cột thứ hai, hàng thứ hai giống như bạn muốn.

Tôi không chắc bạn đã làm gì sai.

Để nhân các tế bào trong cột thứ ba bạn chỉ có thể làm

c = [a[2][i] * b[2][i] for i in range(len(a[2]))] 

nào sẽ làm việc cho bất kỳ số lượng hàng.

Chỉnh sửa: Số đầu tiên là cột, số thứ hai là hàng, với bố cục hiện tại của bạn. Cả hai số này đều được đánh số từ số không. Nếu bạn muốn chuyển đổi thứ tự bạn có thể làm

a = zip(*a) 

hoặc bạn có thể tạo ra nó như vậy:

a=[[1, 2, 3], [1, 1, 1]] 
+0

Đó là vì 'a [1]' chỉ có hai mục. Mảng được đánh số bắt đầu từ số không. 'a [1]' là cột 1, vì vậy chỉ có 'a [1] [0]' và 'a [1] [1]'. – agf

+0

wow! Tôi rất ấn tượng với câu trả lời nhanh. Đó là lỗi của tôi cũng bởi vì tôi đã đơn giản hóa nó với trường hợp a, b này từ một vấn đề lớn hơn mà tôi có. Và cũng thực sự là một [0] [0], [1] [1] hoạt động, nhưng khi tôi tiếp tục cố gắng [1] [2] tôi nhận được lỗi: Traceback (cuộc gọi gần đây nhất): File "" , dòng 1, trong a [1] [2] IndexError: danh sách danh sách nằm ngoài phạm vi ... và điều này kết hợp với đọc trên một số diễn đàn mà mảng không chính xác tương thích với python, khiến tôi nghĩ rằng mình đang làm điều gì sai . Cảm ơn một lần nữa tất cả mọi người! – caran

0

Dường như làm việc ở đây:

>>> a=[[1,1],[2,1],[3,1]] 
>>> a 
[[1, 1], [2, 1], [3, 1]] 
>>> a[1] 
[2, 1] 
>>> a[1][0] 
2 
>>> a[1][1] 
1 
0

a[1][1] làm việc như mong đợi. Bạn có nghĩa là a11 là phần tử đầu tiên của hàng đầu tiên không? Nguyên nhân sẽ là [0] [0].

3

Nếu bạn muốn thực hiện nhiều phép tính với mảng 2d, bạn nên sử dụng mảng NumPy thay vì danh sách tổ.

cho câu hỏi của bạn, bạn có thể sử dụng: zip (* a) để transpose nó:

In [55]: a=[[1,1],[2,1],[3,1]] 
In [56]: zip(*a) 
Out[56]: [(1, 2, 3), (1, 1, 1)] 
In [57]: zip(*a)[0] 
Out[57]: (1, 2, 3) 
0

Nhìn cẩn thận bao nhiêu dấu ngoặc không mảng của bạn có.Tôi đã gặp một ví dụ khi chức năng quay trở lại câu trả lời với khung phụ, như thế:

>>>approx 
array([[[1192, 391]], 
     [[1191, 409]], 
     [[1209, 438]], 
     [[1191, 409]]]) 

Và điều này đã không làm việc

>>> approx[1,1] 
IndexError: index 1 is out of bounds for axis 1 with size 1 

Điều này có thể mở ngoặc:

>>> approx[:,0] 
array([[1192, 391], 
     [1191, 409], 
     [1209, 438], 
     [1191, 409]]) 

Bây giờ nó có thể sử dụng ký pháp truy cập phần tử thông thường:

>>> approx[:,0][1,1] 
409 
Các vấn đề liên quan