2010-04-27 38 views
11

Tôi có một mảng như:mảng cắt trong NumPy/scipy

a = array([[1,2,3],[3,4,5],[4,5,6]]) 

cách hiệu quả nhất để cắt ra một mảng 1x2 trong số này mà chỉ có hai cột đầu tiên của "a" là gì?

Tức là,

array([[2,3],[4,5],[5,6]]) in this case. 

nhờ.

+3

Kết quả ví dụ về Q "1x2" của bạn ...? Và làm thế nào nó có _first_ hai cột? Tôi phải bối rối ... –

+2

@ Alex: nhìn thấy kết quả tôi mong đợi anh ấy có nghĩa là hai cột cuối cùng :) Và 1x2 ... tốt. Có 3 mảng của 2 yếu tố, bạn có thể thấy nó như vậy;) Bạn hoàn toàn đúng, +1 – Wolph

+0

yeah tôi nghĩ rằng đó là một lỗi đánh máy. cố định nó – mithunpaul

Trả lời

18

Hai mảng NumPy chiều được lập chỉ mục sử dụng a[i,j] (không a[i][j]), nhưng bạn có thể sử dụng các ký hiệu cắt tương tự với mảng NumPy và ma trận như bạn có thể với ma trận thông thường trong python (chỉ cần đặt chúng trong một đơn []) :

 
>>> from numpy import array 
>>> a = array([[1,2,3],[3,4,5],[4,5,6]]) 
>>> a[:,1:] 
array([[2, 3], 
     [4, 5], 
     [5, 6]]) 
+0

Quy tắc này chỉ áp dụng cho các mảng 2 chiều không? –

+0

@IvanBalashov Không, bạn cũng có thể sử dụng nó cho kích thước cao hơn. – Demento

4

Đây có phải là những gì bạn đang tìm kiếm không?

a[:,1:] 
1

Hoặc nói cách khác (trích dẫn documentation) cú pháp lát cơ bản là i: j: k trong đó i là chỉ số bắt đầu, j là chỉ số dừng, và k là bước (k> 0)

Bây giờ nếu 'i' không được đặt mặc định là 0 cho k> 0 và n - 1 cho k < 0. Nếu j không được đặt giá trị mặc định là n.

Thats cho mảng một chiều. Bây giờ mảng hai chiều là một con thú khác nhau. Cú pháp cắt là một [rowrange, columnrange]

Vì vậy, nếu bạn muốn tất cả các hàng, nhưng chỉ hai cột cuối cùng, như trong trường hợp của bạn, bạn làm a [0: 3,1: 3].

đây [0: 3] có nghĩa là tất cả các hàng từ 0 đến 3. và [1: 3] có nghĩa là tất cả các cột từ cột 1 đến cột 3.

Bây giờ khi bạn có thể tự hỏi, ngay cả khi bạn chỉ có 3 cột và đánh số bắt đầu từ 1, vì vậy về mặt kỹ thuật lệnh này phải trả về 3 cột ngay. tức là cột 1, cột2, cột 3. Đó là phần phức tạp của cú pháp này. Bạn phải bắt đầu tính từ SAU số đầu tiên. Vì vậy, khi bạn nói [1: 3], bạn đang thực sự nói cho tôi cột 2 và cột 3. Đó là hai cột cuối cùng bạn muốn.

Bây giờ nếu bạn không biết ma trận của bạn là bao lâu hoặc nếu bạn muốn tất cả các hàng, bạn chỉ có thể để trống phần đó. ví dụ:

a [:, 1: 3] cũng sẽ hoạt động.

Các cột tương tự cũng vậy. tức là nếu bạn muốn nói, tất cả các cột nhưng chỉ hàng đầu tiên, bạn sẽ viết

a [0: 1 ,:]

Bây giờ, làm thế nào trên câu trả lời [: 1:] hoạt động là bởi vì khi bạn nói [1:] cho cột, nó có nghĩa là cho tôi bất cứ điều gì SAU KHI cột đầu tiên, và cho đến cuối của tất cả các cột. tức là phương tiện trống rỗng 'đến tận cùng'.

Bây giờ bạn phải nhận ra rằng bất kỳ thứ gì ở hai bên của dấu phẩy đều là tập con của trường hợp một chiều mà tôi đã đề cập ở trên. tôi.e nếu bạn muốn chỉ định các hàng của mình bằng cách sử dụng các kích thước bước bạn có thể viết a [:: 2,1]

Trường hợp nào của bạn sẽ trả lại mảng ([[2, 3], [5, 6]])

tức là lệnh giải thích như sau: cho tôi tất cả các hàng, lấy 2 hàng cùng một lúc. Plus chỉ cho tôi 2 cột cuối cùng.

Điều này đã cho tôi một chút thời gian để tìm hiểu. Vì vậy, dán nó ở đây, chỉ trong trường hợp nó giúp một ai đó.

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