2011-12-23 38 views
5

Có cách nào liệt kê các vị trí không được che giấu của mặt nạ numpy ndarray bị che khuất không (ví dụ: theo cách ndenumerate thực hiện nó cho ndarrays thông thường, nhưng bỏ qua tất cả các mục bị che giấu)?numpy: ndenumerate cho mảng bị che khuất?

CHỈNH SỬA: chính xác hơn: liệt kê không chỉ bỏ qua các mục nhập mặt nạ, mà còn hiển thị chỉ mục của các mục không được che dấu trong mảng ban đầu. Ví dụ. nếu năm phần tử đầu tiên của mảng 1-d được đeo mặt nạ, và phần tử tiếp theo có giá trị unmasked là 3, thì liệt kê sẽ bắt đầu bằng một cái gì đó như ((5,), 3), ....

Cảm ơn!

PS: lưu ý rằng, mặc dù có thể áp dụng ndenumerate cho mặt nạ ndarray, kết quả đếm không phân biệt đối xử giữa các mục nhập mặt nạ và bình thường của nó. Trong thực tế, ndenumerate không chỉ không lọc ra các mục nhập bị che giấu từ liệt kê, nhưng nó thậm chí không thay thế các giá trị liệt kê với hằng số masked. Do đó, người ta không thể điều chỉnh ndenumerate cho tác vụ này bằng cách chỉ gói ndenumerate với bộ lọc phù hợp.

+0

nhìn vào chức năng nén của mảng ma – tillsten

Trả lời

2

Làm thế nào về:

import numpy as np 
import itertools 

def maenumerate(marr): 
    mask = ~marr.mask.ravel() 
    for i, m in itertools.izip(np.ndenumerate(marr), mask): 
     if m: yield i 

N = 12 
a = np.arange(N).reshape(2, 2, 3)+10 

b = np.ma.array(a, mask = (a%5 == 0)) 
for i, val in maenumerate(b): 
    print i, val 

trong đó sản lượng

(0, 0, 1) 11 
(0, 0, 2) 12 
(0, 1, 0) 13 
(0, 1, 1) 14 
(1, 0, 0) 16 
(1, 0, 1) 17 
(1, 0, 2) 18 
(1, 1, 0) 19 
(1, 1, 2) 21 
7

Bạn có thể truy cập chỉ mục hợp lệ sử dụng nghịch đảo của một mặt nạ như một chỉ số:

>>> import numpy as np 
>>> import numpy.ma as ma 
>>> x = np.array([11, 22, -1, 44]) 
>>> m_arr = ma.masked_array(x, mask=[0, 0, 1, 0]) 
>>> for index, i in np.ndenumerate(m_arr[~m_arr.mask]): 
     print index, i 
(0,) 11 
(1,) 22 
(2,) 44 

Xem this cho chi tiết.

Việc liệt kê trên mục chỉ có giá trị với chỉ số từ mảng ban đầu:

>>> for (index, val), m in zip(np.ndenumerate(m_arr), m_arr.mask): 
     if not m: 
     print index, val 
(0,) 11 
(1,) 22 
(3,) 44 
Các vấn đề liên quan