2015-04-25 38 views
5

Hãy nói rằng tôi có một ma trận vuông như đầu vào:Python - NumPy - xóa nhiều hàng và cột từ một mảng

array([[0, 1, 1, 0], 
     [1, 1, 1, 1], 
     [1, 1, 1, 1], 
     [0, 1, 1, 0]]) 

Tôi muốn đếm nonzeros trong mảng sau loại bỏ các hàng 2 và 3 và cols 2 và 3. Sau đó tôi muốn làm tương tự cho các hàng 3 và 4 và cols 3 và 4. Do đó, đầu ra phải là:

0 # when removing rows/cols 2 and 3 
3 # when removing rows/cols 3 and 4 

Đây là giải pháp ngây thơ sử dụng np.delete:

import numpy as np 
a = np.array([[0,1,1,0],[1,1,1,1],[1,1,1,1],[0,1,1,0]]) 
np.count_nonzero(np.delete(np.delete(a, (1,2), axis=0), (1,2), axis=1)) 
np.count_nonzero(np.delete(np.delete(a, (2,3), axis=0), (2,3), axis=1)) 

Nhưng np.delete trả về một mảng mới. Có phương pháp nhanh hơn, có liên quan đến việc xóa hàng và cột đồng thời không? Có thể sử dụng mặt nạ được không? Số documentation trên np.delete lần đọc:

Thường thì nên sử dụng mặt nạ boolean.

Tôi làm cách nào để thực hiện điều đó? Cảm ơn.

+1

Khi bạn đưa ra những loại câu hỏi, điều quan trọng là để giải thích các kích thước của mỗi biến (ví dụ như kích thước của ma trận. , số lượng hàng đã xóa, v.v.) vì chất lượng rất nhiều câu trả lời phụ thuộc vào điều này. – Veedrac

+0

@Veedrac Cảm ơn! Tôi biết. Tôi sẽ cố gắng không quên trong tương lai. Trong trường hợp này, số hàng trong ma trận vuông không bao giờ lớn hơn 10. –

Trả lời

5

Thay vì xóa các cột và hàng bạn không muốn, bạn dễ dàng chọn những cột và hàng bạn muốn. Cũng lưu ý rằng nó là tiêu chuẩn để bắt đầu đếm hàng và cột từ số không. Để có được ví dụ đầu tiên của bạn, bạn nên muốn chọn tất cả các yếu tố trong hàng 0 và 3 và trong hàng 0 và 3. Điều này đòi hỏi advanced indexing, mà bạn có thể sử dụng ix_ utility function:

In [25]: np.count_nonzero(a[np.ix_([0,3], [0,3])]) 
Out[25]: 0 

Ví dụ thứ hai của bạn, bạn muốn chọn hàng 0 và 1 và cột 0 và 1, mà có thể được thực hiện bằng basic slicing:

In [26]: np.count_nonzero(a[:2,:2]) 
Out[26]: 3 
+0

'numpy.ix' là chính xác những gì tôi đã sau. Tôi nên ngồi xuống và đọc tài liệu gumpy một ngày nào đó. Cảm ơn! –

+2

Đọc qua toàn bộ hướng dẫn sử dụng chỉ để khám phá các chức năng tối nghĩa nhưng hữu ích không phải là rất nhiều niềm vui. Làm việc tốt hơn theo cách của bạn thông qua một số hướng dẫn cơ bản, và một số chi tiết hơn về nhập khẩu nhưng khái niệm khó hiểu như phát sóng và một về lập chỉ mục tôi liên kết trong câu trả lời của tôi. –

+0

Việc đầu tiên vẫn liên quan đến việc sao chép.Lưu ý rằng nếu bạn chỉ xóa 2 hàng và cột chưa có ma trận lớn, người ta có thể lấy tổng của 9 ma trận phụ giữa các dòng đã xóa. Những lát đó sẽ không liên quan đến bản sao. – Veedrac

3

Không cần phải sửa đổi mảng ban đầu của bạn bằng cách xóa các hàng/cột, để đếm số phần tử khác 0. Chỉ cần sử dụng lập chỉ mục,

a = np.array([[0,1,1,0],[1,1,1,1],[1,1,1,1],[0,1,1,0]]) 
irows, icols = np.indices(a.shape) 
mask = (irows!=2)&(irows!=3)&(icols!=2)&(icols!=3) 
np.count_nonzero(a[mask]) 
+0

Đây cũng là một giải pháp tốt, nhưng viết ra một mặt nạ rõ ràng cho từng trường hợp không phải là một lựa chọn. Cảm ơn bạn đã trả lời. –

+1

@ tommy.carstensen Vâng, bạn có thể dễ dàng mở rộng điều này, xác định hàm lấy các số hàng/cột và xuất ra một mặt nạ tương ứng. Mặc dù tôi đồng ý rằng nếu bạn có thể sống với việc chọn các cột còn lại với 'np.ix_' sẽ là một cách tiếp cận tốt hơn. – rth

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