2011-08-27 36 views
6

Tôi hiểu cách tạo mảng mặt nạ và tôi muốn sử dụng mặt nạ trong mảng bản ghi để tôi có thể truy cập dữ liệu này bằng cách sử dụng thuộc tính được đặt tên. Các mặt nạ dường như bị "mất" khi tôi tạo một mảng kỷ lục từ một mảng đeo mặt nạ:Làm cách nào để che các phần tử của mảng bản ghi trong Numpy?

>>> data = np.ma.array(np.ma.zeros(30, dtype=[('date', '|O4'), ('price', '<f8')]),mask=[i<10 for i in range(30)]) 
>>> data 
masked_array(data = [(--, --) (--, --) (--, --) (--, --) (--, --) (--, --) (--, --) (--, --) 
(--, --) (--, --) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) 
(0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0)], 
     mask = [(True, True) (True, True) (True, True) (True, True) (True, True) 
(True, True) (True, True) (True, True) (True, True) (True, True) 
(False, False) (False, False) (False, False) (False, False) (False, False) 
(False, False) (False, False) (False, False) (False, False) (False, False) 
(False, False) (False, False) (False, False) (False, False) (False, False) 
(False, False) (False, False) (False, False) (False, False) (False, False)], 
    fill_value = ('?', 1e+20), 
     dtype = [('date', '|O4'), ('price', '<f8')]) 

>>> r = data.view(np.recarray) 
>>> r 
rec.array([(0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), 
      (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), 
      (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), 
      (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), 
      (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0)], 
      dtype=[('date', '|O4'), ('price', '<f8')]) 

Khi tôi truy cập vào một kỷ lục dữ liệu không được đeo mặt nạ:

>>> r.date[0] 
0 

Không giống như trong mảng ban đầu:

>>> data['date'][0] 
masked_array(data = --, 
      mask = True, 
     fill_value = 1e+20) 

     fill_value = 1e+20) 

Tôi có thể làm gì? Liệu mảng bản ghi không hỗ trợ mặt nạ? Duyệt web Tôi đã thấy một số ví dụ mã có vẻ đề xuất khác, nhưng nó không rõ ràng lắm. Hy vọng tôi có thể nhận được câu trả lời hay ở đây.

Trả lời

3

Tôi chưa tìm thấy nhiều tài liệu về numpy.ma.mrecords.MaskedRecords, ngoại trừ một đề cập ngắn gọn here. Bạn có thể tìm thấy một số ví dụ về cách sử dụng nó bằng cách nghiên cứu các bài kiểm tra đơn vị đi kèm với numpy. (ví dụ: /usr/lib/python2.6/dist-packages/numpy/ma/tests/test_mrecords.py).

import numpy as np 
import numpy.ma.mrecords as mrecords 

data = np.ma.array(
    np.ma.zeros(30, dtype=[('date', '|O4'), ('price', '<f8')]), 
    mask=[i<10 for i in range(30)]) 

r = data.view(mrecords.mrecarray) 

print(r.date[0]) 
# -- 
+0

Cảm ơn, tôi không biết về numpy.ma.mrecords. –

+0

Tôi không cho rằng có cách nào để che dấu các trường riêng lẻ? Trường hợp sử dụng của tôi là thêm một trường có nguồn gốc mới được gọi là "100 ngày cao" (hoặc một cái gì đó tương tự) vì vậy tôi muốn che dấu trường này cho 100 bản ghi đầu tiên. –

+0

@Nate Reed: Tôi nghĩ điều đó là có thể. Bạn đã thử một cái gì đó như 'data.mask ['price'] [dữ liệu ['ngày'] <...] = True'? – unutbu

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