2012-06-21 33 views
5

Tôi đang vẽ đồ thị một số cột của một mảng lớn dữ liệu (thông qua numpy.genfromtxt) với cột thời gian có kích thước bằng nhau. Thiếu dữ liệu thường được gọi là nan, -999, -9999, vv Tuy nhiên tôi không thể tìm ra cách để loại bỏ nhiều giá trị khỏi mảng. Đây là những gì tôi hiện có:Tạo một mảng mặt nạ trong Python với nhiều giá trị đã cho

for cur_col in range(start_col, total_col): 
    # Generate what is to be graphed by removing nan values 
    data_mask = (file_data[:, cur_col] != nan_values) 
    y_data = file_data[:, cur_col][data_mask] 
    x_data = file_data[:, time_col][data_mask] 

Sau đó tôi sử dụng matplotlib để tạo các số liệu thích hợp cho mỗi cột. Điều này làm việc tốt nếu nan_values ​​là một số nguyên duy nhất, nhưng tôi đang tìm cách sử dụng một danh sách.

EDIT: Đây là ví dụ hoạt động.

import numpy as np 

file_data = np.arange(12.0).reshape((4,3)) 
file_data[1,1] = np.nan 
file_data[2,2] = -999 
nan_values = -999 

for cur_col in range(1,3): 
    # Generate what is to be graphed by removing nan values 
    data_mask = (file_data[:, cur_col] != nan_values) 
    y_data = file_data[:, cur_col][data_mask] 
    x_data = file_data[:, 0][data_mask] 
    print 'y: ' + str(y_data) 
    print 'x: ' + str(x_data) 
print file_data 

>>> y: [ 1. nan 7. 10.] 
    x: [ 0. 3. 6. 9.] 
    y: [ 2. 5. 11.] 
    x: [ 0. 3. 9.] 
    [[ 0. 1. 2.] 
    [ 3. nan 5.] 
    [ 6. 7. -999.] 
    [ 9. 10. 11.]] 

Điều này sẽ không hoạt động nếu nan_values ​​= ['nan', -999] là điều tôi muốn hoàn thành.

+0

xin vui lòng gửi các mảng mẫu (danh sách). –

+0

@AshwiniChaudhary Tôi đã chỉnh sửa câu hỏi để bao gồm một ví dụ làm việc. – Josiah

Trả lời

4

tôi sẽ đề nghị sử dụng masked arrays như vậy:

>>> a = np.arange(12.0).reshape((4,3)) 
>>> a[1,1] = np.nan 
>>> a[2,2] = -999 
>>> a 
array([[ 0., 1., 2.], 
     [ 3., nan, 5.], 
     [ 6., 7., -999.], 
     [ 9., 10., 11.]]) 
>>> m = np.ma.array(a,mask=(~np.isfinite(a) | (a == -999))) 
>>> m 
masked_array(data = 
[[0.0 1.0 2.0] 
[3.0 -- 5.0] 
[6.0 7.0 --] 
[9.0 10.0 11.0]], 
      mask = 
[[False False False] 
[False True False] 
[False False True] 
[False False False]], 
     fill_value = 1e+20) 
+0

Trong khi kết quả là những gì tôi cần, nó không sử dụng một danh sách mà rất nhiều sẽ sắp xếp những gì tôi đang làm. Có cách nào để thay thế các câu lệnh hoặc bằng một danh sách cho mặt nạ = trong ma.array không? – Josiah

+2

'mask = np.logical_or.reduce ([a == giá trị cho giá trị trong [-99, -999, -9999]])'. Hãy nhận biết rằng 'np.nan! = Np.nan', vì vậy bạn sẽ phải thêm nó vào mặt nạ một cách rõ ràng. – user545424

+0

Tuyệt vời, chính xác những gì tôi cần. Cảm ơn bạn. – Josiah

2

tôi sẽ cố gắng một cái gì đó tương tự (pseudo-code):

nan_values = [...] 

for cur_col in range(start_col, total_col): 
    # Generate what is to be graphed by removing nan values 
    y_data = [file_data[i,cur_col] for i in range(len(file_data)) if not(file_data[i,cur_col] in nan_values)] 
    x_data = [file_data[i,time_col] for i in range(len(file_data)) if not(file_data[i,cur_col] in nan_values)] 
+0

Tôi không thể triển khai ví dụ này vào ví dụ hoạt động mà tôi vừa thêm vào. Tôi nhận được 'đối số của loại' int 'là không thể lặp lại' – Josiah

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