2010-08-31 41 views
12

Trong Numpy 1.4.1, cách đơn giản nhất hoặc hiệu quả nhất để tính toán biểu đồ của một mảng bị che khuất là là gì? numpy.histogrampyplot.hist đếm các phần tử được đeo mặt nạ, theo mặc định!Làm thế nào để tạo biểu đồ của một mảng với các giá trị được che dấu, trong Numpy?

Giải pháp đơn giản duy nhất tôi có thể nghĩ ngay bây giờ liên quan đến việc tạo ra một mảng mới với giá trị không đeo mặt nạ:

histogram(m_arr[~m_arr.mask]) 

Đây không phải là rất hiệu quả, tuy nhiên, vì điều này không cần thiết tạo ra một mảng mới. Tôi rất vui khi đọc về những ý tưởng tốt hơn!

+1

Đối với những gì đáng giá, điều này có thể được coi là lỗi trong 'numpy.histogram'. Bạn có lẽ nên gửi một báo cáo lỗi và đề cập đến nó trên danh sách gửi thư. Nó dễ dàng được sửa bằng cách thay thế 'asarray' bằng' asanyarray' trong các nguồn 'numpy.histogram'. –

+0

Joe, bạn có thể muốn gửi bình luận của bạn như là một câu trả lời: Tôi cũng có thể đánh dấu nó là câu trả lời được chấp nhận, nếu được xác nhận bởi các nhà phát triển Numpy. – EOL

+2

Tôi đã gửi một câu hỏi nhanh đến danh sách. http://mail.scipy.org/pipermail/numpy-discussion/2010-September/052575.html Chúng tôi sẽ xem liệu mọi người có coi đó là lỗi hay không. Dường như có vẻ phản đối trực quan với tôi ít nhất. –

Trả lời

13

(undeleting này theo thảo luận ở trên ...)

Tôi không chắc chắn có hay không các nhà phát triển NumPy sẽ coi đây là một lỗi hoặc hành vi mong đợi. Tôi asked on the mailing list, vì vậy tôi đoán chúng ta sẽ thấy những gì họ nói.

Dù bằng cách nào, đây là cách khắc phục dễ dàng. Vá numpy/lib/function_base.py để sử dụng numpy.asanyarray thay vì numpy.asarray trên các đầu vào cho hàm sẽ cho phép nó sử dụng đúng các mảng được che dấu (hoặc bất kỳ lớp con nào khác của một biến thể) mà không tạo bản sao.

Chỉnh sửa: Có vẻ như đó là hành vi mong đợi. As discussed here:

Nếu bạn muốn bỏ qua dữ liệu đeo mặt nạ đó là chỉ trên thêm chức năng gọi

histogram (m_arr.compressed())

Tôi không nghĩ rằng thực tế là điều này làm cho một bản sao bổ sung sẽ có liên quan, vì tôi đoán mảng bị che chắn đầy đủ xử lý bên trong biểu đồ sẽ là số tiền đắt hơn nhiều.

Sử dụng dấu asanyarray cũng sẽ cho phép ma trận và các loại phụ khác có thể không được xử lý chính xác bằng cách tính toán biểu đồ .

Đối với bất cứ điều gì khác ngoài thả quan sát đeo mặt nạ, nó sẽ là cần thiết để tìm ra những gì các định nghĩa mảng đeo mặt nạ của một biểu đồ là, như Bruce chỉ ra.

+0

Cảm ơn bạn. Một trong các đối số chống lại việc xử lý các mảng bị che dấu trong biểu đồ là nếu các biểu đồ xử lý các giá trị được che dấu, ta sẽ phải quyết định cách xử lý dữ liệu mặt nạ với mảng trọng số có mặt nạ. Tôi không nghĩ rằng có bất kỳ giải pháp rõ ràng nào tốt hơn cho vấn đề này: có vẻ như các tính năng của 'histogram()' không kết hợp quá tốt với các mảng đầu vào + trọng lượng mặt nạ. – EOL

7

Hãy thử hist(m_arr.compressed()).

+1

Đây là một ý tưởng tốt hơn 'm_arr [~ m_arr.mask]' của tôi. Tuy nhiên, nó không giải quyết được vấn đề mà một mảng mới được sửa chữa không cần thiết. – EOL

+0

PS: "đã sửa" -> "đã tạo" – EOL

2

Đây là một câu hỏi siêu cũ, nhưng những ngày này tôi chỉ sử dụng:

numpy.histogram(m_arr, bins=.., range=.., density=False, weights=m_arr_mask)

đâu m_arr_mask là một mảng với hình dạng giống như m_arr, bao gồm 0 giá trị cho các yếu tố của m_arr để được loại trừ khỏi biểu đồ và 1 giá trị cho các phần tử được đưa vào.

+0

Tính năng này hoạt động tốt như thế nào đối với NaN? –

+0

Ngoài ra, điều này sẽ không hoạt động nếu bạn cố gắng chuyển một chuỗi cho 'bins'. Câu trả lời tuyệt vời ngoài điều đó. –

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