如何正确屏蔽 numpy 二维数组?
How to properly mask a numpy 2D array?
假设我有一个二维坐标数组,看起来像
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]])
一定有更简单的方法吗?
这是您要找的吗?
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)
在你的最后一个例子中,问题不在于面具。是你对compressed
的使用。来自 compressed
的文档字符串:
Return all the non-masked data as a 1-D array.
因此 compressed
将未屏蔽的值展平为一维数组。 (必须的,因为不能保证压缩后的数据一定是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)
你的 x
是 3x2:
In [379]: x
Out[379]:
array([[1, 2],
[2, 3],
[3, 4]])
制作一个 3 元素布尔掩码:
In [380]: rowmask=np.array([False,False,True])
可用于 select 为 True 或 False 的行。在这两种情况下,结果都是 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
应用到它会产生一个混乱的数组:array([1, 2, 2, 3])
由于屏蔽是逐个元素进行的,它可以屏蔽第 1 行中的一个元素、第 2 行中的 2 个元素等。因此通常 compressing
,删除屏蔽的元素不会产生二维数组。扁平化形式是唯一的通用选择。
np.ma
当屏蔽值分散时最有意义。如果您想 select 或 deselect 整行或整列,它没有多大价值。
===============
以下是更典型的屏蔽数组:
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)
因为 none 这些解决方案对我有用,所以我想写下解决方案的作用,也许对其他人有用。我使用 python 3.x 并处理了两个 3D 数组。我称之为 data_3D
的一个包含大脑扫描记录的浮点值,另一个 template_3D
包含代表大脑区域的整数。我想根据 template_3D
:
从 data_3D
中选择对应于整数 region_code
的那些值
my_mask = np.in1d(template_3D, region_code).reshape(template_3D.shape)
data_3D_masked = data_3D[my_mask]
这给了我一个只有相关录音的一维数组。
有了np.where
你可以做各种各样的事情:
x_maskd = np.where(mask, x, 0)
如果你有
A = [[ 8. 0. 165. 22. 164. 47. 184. 185.]
[ 0. 6. -74. -27. 63. 49. -46. -48.]
[165. -74. 0. 0. 0. 0. 0. 0.]
[ 22. -27. 0. 0. 0. 0. 0. 0.]
[164. 63. 0. 0. 0. 0. 0. 0.]
[ 47. 49. 0. 0. 0. 0. 0. 0.]
[184. -46. 0. 0. 0. 0. 0. 0.]
[185. -48. 0. 0. 0. 0. 0. 0.]]
你的面具是
mask = np.array([True, True, True, False, True, False, True, False])
那么你的蒙版 A 就变成了
A[mask, :][:, mask] = [[ 8. 0. 165. 164. 184.]
[ 0. 6. -74. 63. -46.]
[165. -74. 0. 0. 0.]
[164. 63. 0. 0. 0.]
[184. -46. 0. 0. 0.]]
假设我有一个二维坐标数组,看起来像
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]])
一定有更简单的方法吗?
这是您要找的吗?
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)
在你的最后一个例子中,问题不在于面具。是你对compressed
的使用。来自 compressed
的文档字符串:
Return all the non-masked data as a 1-D array.
因此 compressed
将未屏蔽的值展平为一维数组。 (必须的,因为不能保证压缩后的数据一定是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)
你的 x
是 3x2:
In [379]: x
Out[379]:
array([[1, 2],
[2, 3],
[3, 4]])
制作一个 3 元素布尔掩码:
In [380]: rowmask=np.array([False,False,True])
可用于 select 为 True 或 False 的行。在这两种情况下,结果都是 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
应用到它会产生一个混乱的数组:array([1, 2, 2, 3])
由于屏蔽是逐个元素进行的,它可以屏蔽第 1 行中的一个元素、第 2 行中的 2 个元素等。因此通常 compressing
,删除屏蔽的元素不会产生二维数组。扁平化形式是唯一的通用选择。
np.ma
当屏蔽值分散时最有意义。如果您想 select 或 deselect 整行或整列,它没有多大价值。
===============
以下是更典型的屏蔽数组:
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)
因为 none 这些解决方案对我有用,所以我想写下解决方案的作用,也许对其他人有用。我使用 python 3.x 并处理了两个 3D 数组。我称之为 data_3D
的一个包含大脑扫描记录的浮点值,另一个 template_3D
包含代表大脑区域的整数。我想根据 template_3D
:
data_3D
中选择对应于整数 region_code
的那些值
my_mask = np.in1d(template_3D, region_code).reshape(template_3D.shape)
data_3D_masked = data_3D[my_mask]
这给了我一个只有相关录音的一维数组。
有了np.where
你可以做各种各样的事情:
x_maskd = np.where(mask, x, 0)
如果你有
A = [[ 8. 0. 165. 22. 164. 47. 184. 185.]
[ 0. 6. -74. -27. 63. 49. -46. -48.]
[165. -74. 0. 0. 0. 0. 0. 0.]
[ 22. -27. 0. 0. 0. 0. 0. 0.]
[164. 63. 0. 0. 0. 0. 0. 0.]
[ 47. 49. 0. 0. 0. 0. 0. 0.]
[184. -46. 0. 0. 0. 0. 0. 0.]
[185. -48. 0. 0. 0. 0. 0. 0.]]
你的面具是
mask = np.array([True, True, True, False, True, False, True, False])
那么你的蒙版 A 就变成了
A[mask, :][:, mask] = [[ 8. 0. 165. 164. 184.]
[ 0. 6. -74. 63. -46.]
[165. -74. 0. 0. 0.]
[164. 63. 0. 0. 0.]
[184. -46. 0. 0. 0.]]