Как правильно замаскировать двумерный массив?

Скажем, у меня есть двумерный массив координат, который выглядит как

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

Ранее в своей работе я создал маску, которая в итоге выглядела как

mask = [False,False,True]

Когда я пытаюсь использовать эту маску для 2D координатного вектора, я получаю сообщение об ошибке

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.`

что имеет смысл, я полагаю. Поэтому я попытался вместо этого просто использовать следующую маску:

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

И то, что я получаю, близко:

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

к тому, что я ожидал (и хочу):

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

Должен быть более простой способ сделать это?

Ответы на вопрос(4)

Вашx 3х2:

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

Создайте трехэлементную логическую маску:

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

Это может быть использовано для выбора строк, где это Истина или где Ложь. В обоих случаях результат 2d:

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

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

Это без использования подкласса MaskedArray. Чтобы сделать такой массив, нам нужна маска, которая соответствуетx в форме. Не предусмотрено маскирование только одного измерения.

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)

применениеcompressed к тому, что производит raveled массив:array([1, 2, 2, 3])

Поскольку маскирование является элементом за элементом, оно может маскировать один элемент в строке 1, 2 в строке 2 и т. Д. Так что в общемcompressingудаление маскированных элементов не даст 2d массив. Сглаженная форма - единственный общий выбор.

np.ma имеет смысл, когда есть разброс маскированных значений. Это не имеет большого значения, если вы хотите выделить или отменить выбор целых строк или столбцов.

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

Вот более типичные маскированные массивы:

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)

В вашем последнем примере проблема не в маске. Это ваше использованиеcompressed, Из документацииcompressed:

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

Такcompressed сглаживает немаскированные значения в 1-й массив. (Это необходимо, потому что нет гарантии, что сжатые данные будут иметь 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)
 Warren Weckesser05 июл. 2016 г., 03:50
Если я понимаю, что вы пытаетесь сделать, первое предложение @ Psidom выглядит разумным. В частности, вам, вероятно, не нужен замаскированный массив. Просто индексируйте обычный массив с помощью логического массива.
 Anonymous05 июл. 2016 г., 03:48
Вы правы, это правильно, прежде чем я сожму это. Я прочитаю документацию о способе удаления маскированных элементов при сохранении размерности массива. Спасибо
Решение Вопроса

Это то, что вы ищите?

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

Или измассив маски:

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)
 Psidom05 июл. 2016 г., 03:52
Я не слишком много о замаскированном массиве, вероятно, того же уровня, что и вы. Просто пытаюсь заставить это работать. Ну, если вы пытаетесь удалить элементы, я думаю, что логический индекс не плохой путь.
 Anonymous05 июл. 2016 г., 03:47
Ах, я вижу, что то, что я пытался, работает, я просто не могу сжать это. Гектометр Есть ли способ удалить замаскированные элементы массива без потери размерности массива?np.ma.compressed() делает оба.

я подумал записать, какое решение имело место, может быть, оно пригодится кому-то еще. Я использую Python 3.x и я работал над двумя 3D-массивами. Тот, который я называюdata_3D содержит плавающие значения записей в сканировании мозга, а другой,template_3D содержит целые числа, которые представляют области мозга. Я хотел выбрать эти значения изdata_3D соответствует целому числуregion_code согласноtemplate_3D:

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

который дает мне массив 1D только соответствующих записей.

Ваш ответ на вопрос