Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除与布尔掩码对应的数组中的所有元素_Python_Arrays_Numpy_Multidimensional Array_Slice - Fatal编程技术网

Python 删除与布尔掩码对应的数组中的所有元素

Python 删除与布尔掩码对应的数组中的所有元素,python,arrays,numpy,multidimensional-array,slice,Python,Arrays,Numpy,Multidimensional Array,Slice,我有一个作为二维numpy数组(布尔数组)存在的布尔掩码 我还有一个单独的二维numpy值数组,它的维数与布尔掩码(值数组)相同 我想做的是删除布尔区域中相同位置等于False的值数组中的所有元素。有没有一个简单的方法可以做到这一点 本例所需的输出为: array([[ 19.189 , 23.2535, 23.1555, 23.4655, 22.6795, 20.3295, 19.7005], [ 20.688 , 20.537 , 23.8465, 21.22

我有一个作为二维numpy数组(布尔数组)存在的布尔掩码

我还有一个单独的二维numpy值数组,它的维数与布尔掩码(值数组)相同

我想做的是删除布尔区域中相同位置等于
False
的值数组中的所有元素。有没有一个简单的方法可以做到这一点

本例所需的输出为:

array([[ 19.189 ,  23.2535,  23.1555,  23.4655,  22.6795,  20.3295,  19.7005],
       [ 20.688 ,  20.537 ,  23.8465,  21.2265,  24.5805,  25.842 ,  23.198 ],
       [ 22.418 ,  21.0115,  21.0355,  20.217 ,  24.1275,  24.4595,  21.981 ],
       [ 21.156 ,  18.6195,  23.299 ,  22.5535,  23.2305,  28.749 ,  21.0245]])

在这个特定的示例中,所有
False
值都存在于布尔数组的末尾,但情况并非总是如此,它们可以随机分布。因此,我需要一种从值数组中删除任何元素的方法,其中对应的掩码值等于布尔数组中的
False
,假设掩码将由所有
True
或所有
False
行组成,则可以使用
掩码。all(axis=1)
和索引:

In [116]: x
Out[116]: 
array([[ 1.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  1.]])

In [117]: x[mask.all(axis=1)]
Out[117]: 
array([[ 1.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.]])

在大多数情况下,您可以简单地创建一个行为类似于“删除”的元素,该元素还允许从列/行中“删除”单个元素,同时保持维度不变:

import numpy as np
arr = np.array([[ 19.189 , 23.2535, 23.1555, 23.4655, 22.6795, 20.3295, 19.7005],
                [ 20.688 , 20.537 , 23.8465, 21.2265, 24.5805, 25.842 , 23.198 ],
                [ 22.418 , 21.0115, 21.0355, 20.217 , 24.1275, 24.4595, 21.981 ],
                [ 21.156 , 18.6195, 23.299 , 22.5535, 23.2305, 28.749 , 21.0245],
                [ 21.7495, 19.614 , 20.3025, 21.706 , 22.853 , 19.623 , 16.7415],
                [ 20.9715, 21.9505, 21.1895, 21.471 , 21.0445, 21.096 , 19.3295],
                [ 24.3815, 26.2095, 25.3595, 22.9985, 21.586 , 23.796 , 20.375 ]])
mask = np.array([[ True,  True,  True,  True,  True,  True,  True],
                 [ True,  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]])
marr = np.ma.MaskedArray(arr, mask=~mask)
marr
给出:

masked_array(data =
 [[19.189 23.2535 23.1555 23.4655 22.6795 20.3295 19.7005]
 [20.688 20.537 23.8465 21.2265 24.5805 25.842 23.198]
 [22.418 21.0115 21.0355 20.217 24.1275 24.4595 21.981]
 [21.156 18.6195 23.299 22.5535 23.2305 28.749 21.0245]
 [-- -- -- -- -- -- --]
 [-- -- -- -- -- -- --]
 [-- -- -- -- -- -- --]],
             mask =
 [[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]
 [ True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True]],
       fill_value = 1e+20)
在这种情况下,还可以使用以下内容压缩至少包含一个屏蔽元素的所有行:


为了说明我的评论:

In [33]: arr = np.arange(12).reshape(3,4)
In [34]: mask = ((arr+1)%3)>0
In [35]: mask
Out[35]: 
array([[ True,  True, False,  True],
       [ True, False,  True,  True],
       [False,  True,  True, False]], dtype=bool)
arr[mask]
是1d,因为通常此选择不会返回整洁的2d数组

In [36]: arr[mask]
Out[36]: array([ 0,  1,  3,  4,  6,  7,  9, 10])
我们可以通过掩蔽阵列解决方案清楚地看到这一点

In [37]: marr = np.ma.MaskedArray(arr,mask=~mask)
In [38]: marr
Out[38]: 
masked_array(data =
 [[0 1 -- 3]
 [4 -- 6 7]
 [-- 9 10 --]],
             mask =
 [[False False  True False]
 [False  True False False]
 [ True False False  True]],
       fill_value = 999999)
ma
compressed返回1d数组

In [39]: marr.compressed()
Out[39]: array([ 0,  1,  3,  4,  6,  7,  9, 10])
有了8个术语,我可以把它改成(4,2),但不涉及3


您可以使用
any
all
的各种组合来屏蔽整行或整列。整行是真还是假?或者会有混合?如果我的答案有帮助,你可以或告诉我哪里出了问题,这样我就可以修复它。
arr[mask]
做出这样的选择。结果将是1d,因为通常这样的掩码可以选择每行不同数量的值。在某些情况下,您可能能够将结果重塑为有意义的二维数组。
In [36]: arr[mask]
Out[36]: array([ 0,  1,  3,  4,  6,  7,  9, 10])
In [37]: marr = np.ma.MaskedArray(arr,mask=~mask)
In [38]: marr
Out[38]: 
masked_array(data =
 [[0 1 -- 3]
 [4 -- 6 7]
 [-- 9 10 --]],
             mask =
 [[False False  True False]
 [False  True False False]
 [ True False False  True]],
       fill_value = 999999)
In [39]: marr.compressed()
Out[39]: array([ 0,  1,  3,  4,  6,  7,  9, 10])