2016-07-05 19 views
6

Nói rằng tôi có một mảng chiều hai tọa độ mà trông giống nhưLàm thế nào để che giấu một cách chính xác mảng 2D numpy?

x = array([[1,2],[2,3],[3,4]])

Trước đây trong công việc của tôi cho đến nay, tôi tạo ra một mặt nạ mà kết thúc lên tìm kiếm cái gì đó như

mask = [False,False,True]

Khi tôi cố sử dụng mặt nạ này trên vectơ tọa độ 2D, tôi gặp lỗi

newX = np.ma.compressed(np.ma.masked_array(x,mask)) 

>>>numpy.ma.core.MaskError: Mask and data not compatible: data size 
    is 6, mask size is 3.` 

có ý nghĩa, tôi cho là vậy. Vì vậy, tôi đã cố gắng để chỉ cần sử dụng mặt nạ sau đây thay vì:

mask2 = np.column_stack((mask,mask)) 
newX = np.ma.compressed(np.ma.masked_array(x,mask2)) 

Và những gì tôi nhận được gần:

>>>array([1,2,2,3])

với những gì tôi mong đợi (và muốn):

>>>array([[1,2],[2,3]])

Phải có cách dễ dàng hơn để thực hiện việc này?

Trả lời

5

Đây có phải là những gì bạn đang tìm kiếm không?

import numpy as np 
x[~np.array(mask)] 
# array([[1, 2], 
#  [2, 3]]) 

Hoặc từ numpy masked array:

newX = np.ma.array(x, mask = np.column_stack((mask, mask))) 
newX 

# masked_array(data = 
# [[1 2] 
# [2 3] 
# [-- --]], 
#    mask = 
# [[False False] 
# [False False] 
# [ True True]], 
#  fill_value = 999999) 
+0

Ah tôi hiểu, vì vậy những gì tôi đang cố gắng làm việc, tôi chỉ không thể nén nó. Hm. là có một cách để loại bỏ các yếu tố đeo mặt nạ của một mảng mà không mất kích thước của mảng? 'np.ma.compressed()' thực hiện cả hai. – Anonymous

+0

Tôi không quá nhiều về mảng bị che dấu, hoặc có thể là cùng cấp với bạn. Chỉ cần cố gắng để làm cho nó hoạt động. Vâng, nếu bạn đang cố gắng để loại bỏ các yếu tố, tôi nghĩ rằng chỉ số logic không phải là một cách xấu. – Psidom

1

Trong ví dụ cuối cùng của bạn, vấn đề không phải là mặt nạ. Đó là việc bạn sử dụng số compressed. Từ docstring của compressed:

Return all the non-masked data as a 1-D array. 

Vì vậy compressed flattens các giá trị nonmasked vào một mảng 1-d. (Nó phải, vì không có sự đảm bảo rằng các dữ liệu nén sẽ có một cấu trúc n-chiều.)

Hãy nhìn vào mảng đeo mặt nạ trước khi bạn nén nó:

In [8]: np.ma.masked_array(x, mask2) 

Out[8]: 
masked_array(data = 
[[1 2] 
[2 3] 
[-- --]], 
      mask = 
[[False False] 
[False False] 
[ True True]], 
     fill_value = 999999) 
+0

Bạn nói đúng, chính xác trước khi tôi nén nó. Tôi sẽ đọc tài liệu cho một cách để loại bỏ các phần tử đeo mặt nạ trong khi vẫn giữ nguyên kích thước mảng. Cảm ơn – Anonymous

+0

Nếu tôi hiểu những gì bạn đang cố gắng làm, đề xuất đầu tiên của Psidom có ​​vẻ hợp lý. Đặc biệt, bạn có thể không cần một mảng có mặt nạ. Chỉ cần lập chỉ mục một mảng thông thường với một mảng boolean. –

4

bạn x là 3x2 :

In [379]: x 
Out[379]: 
array([[1, 2], 
     [2, 3], 
     [3, 4]]) 

Thực hiện một 3 yếu tố boolean mặt nạ:

In [380]: rowmask=np.array([False,False,True]) 

Điều đó có thể được sử dụng để chọn các hàng mà nó là True, hoặc ở đâu Sai. Trong cả hai trường hợp, kết quả là 2d:

In [381]: x[rowmask,:] 
Out[381]: array([[3, 4]]) 

In [382]: x[~rowmask,:] 
Out[382]: 
array([[1, 2], 
     [2, 3]]) 

Điều này là không sử dụng lớp con MaskedArray. Để tạo mảng như vậy, chúng tôi cần một mặt nạ phù hợp với hình dạng x. Không có điều khoản để che giấu chỉ một chiều.

In [393]: xmask=np.stack((rowmask,rowmask),-1) # column stack 

In [394]: xmask 
Out[394]: 
array([[False, False], 
     [False, False], 
     [ True, True]], dtype=bool) 

In [395]: np.ma.MaskedArray(x,xmask) 
Out[395]: 
masked_array(data = 
[[1 2] 
[2 3] 
[-- --]], 
      mask = 
[[False False] 
[False False] 
[ True True]], 
     fill_value = 999999) 

Áp dụng compressed để mà tạo ra một mảng raveled: array([1, 2, 2, 3])

Kể từ khi mặt nạ là phần tử bằng phần tử, nó có thể che giấu một phần tử trong hàng 1, 2 trong dòng 2 vv Vì vậy, nói chung compressing, tháo các phần tử được che chắn, sẽ không mang lại mảng 2d. Dạng phẳng là lựa chọn chung duy nhất.

np.ma có ý nghĩa nhất khi có sự tán xạ các giá trị được đeo mặt nạ. Nó không có giá trị nhiều nếu bạn muốn chọn, hoặc bỏ chọn, toàn bộ hàng hoặc cột.

===============

Dưới đây là điển hình hơn mảng đeo mặt nạ:

In [403]: np.ma.masked_inside(x,2,3) 
Out[403]: 
masked_array(data = 
[[1 --] 
[-- --] 
[-- 4]], 
      mask = 
[[False True] 
[ True True] 
[ True False]], 
     fill_value = 999999) 

In [404]: np.ma.masked_equal(x,2) 
Out[404]: 
masked_array(data = 
[[1 --] 
[-- 3] 
[3 4]], 
      mask = 
[[False True] 
[ True False] 
[False False]], 
     fill_value = 2) 

In [406]: np.ma.masked_outside(x,2,3) 
Out[406]: 
masked_array(data = 
[[-- 2] 
[2 3] 
[3 --]], 
      mask = 
[[ True False] 
[False False] 
[False True]], 
     fill_value = 999999) 
0

Kể từ khi không ai trong số các giải pháp này làm việc cho tôi, tôi nghĩ để viết những giải pháp đã làm, có lẽ nó sẽ hữu ích cho người khác. Tôi sử dụng python 3.x và tôi đã làm việc trên hai mảng 3D. Một cái mà tôi gọi là data_3D chứa các giá trị nổi của bản ghi trong một lần quét não và cái kia, template_3D chứa các số nguyên đại diện cho các vùng của não. Tôi muốn chọn những giá trị từ data_3D tương ứng với một số nguyên region_code theo template_3D:

my_mask = np.in1d(template_3D, region_code).reshape(template_3D.shape) 
data_3D_masked = data_3D[my_mask] 

mà mang lại cho tôi một mảng 1D các bản ghi chỉ có liên quan.

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