怎么样的东西:
import numpy as np
from numpy.ma import masked_array
data = masked_array(data = [7, 0, 7, 1, 8, 0, 1, 1, 0, 0, 3, 0, 0, 3, 0],
mask = [False, True, False, False, False, True, False, False, True, True, False, True, True, False, True])
flag = masked_array(data = [True, False, False, True, 0, 0, 0, False, 0, True, 0, 0, 0, 0, True],
mask = [False, False, False, False, True, True, True, False, True, False, True, True, True, True, False])
print(repr(data))
print(repr(flag))
indices = np.where(flag & ~flag.mask)
print(data[indices])
flag
请注意,如果无法将 中的掩码值与 进行比较,您可能会遇到麻烦&
,但您的情况似乎并非如此。
输出:
masked_array(数据 = [7 -- 7 1 8 -- 1 1 -- -- 3 -- -- 3 --],
掩码 = [假真假假假真假假真真假真真假真],
填充值 = 999999)
masked_array(数据 = [1 0 0 1 -- -- -- 0 -- 1 -- -- -- -- 1],
掩码 = [假假假假真真真假真假真真真真假],
填充值 = 999999)
[7 1 -- --]
编辑:
获取索引的另一种方法也可能是:
indices = np.where(flag.filled(False))
更新(编辑 2):
注意使用数组索引数组的微妙之处。
考虑以下代码:
import numpy as np
data = np.array([1,2,3,4,5])
mask = np.array([True, False, True, False, True])
res = data[mask]
print(res)
正如您可能(或可能不会)期望的那样,在这里,掩码用作“过滤器”,过滤掉掩码中相应位置为 False 的数据元素。由于我为data
and选择的值mask
,其效果是索引用于过滤掉偶data
数值,只留下奇数值。
这里的输出是:[1 3 5]
.
现在,考虑非常相似的代码:
import numpy as np
data = np.array([1,2,3,4,5])
mask = np.array([1, 0, 1, 0, 1])
res = data[mask]
print(res)
在这里,唯一改变的是掩码元素的数据类型,它们的布尔值是相同的。我们称第一个掩码(由True
/False
值组成)mask1
和第二个掩码(由1
/0
值组成)mask2
。
dtype
您可以通过属性(例如print(mask.dtype)
) 检查数组的数据类型。mask1
具有 dtype bool
,而mask2
具有 dtype int32
。
但是,这里的输出是不同的: [2 1 2 1 2]
.
这里发生了什么?
事实上,索引的行为因用于索引的数组的数据类型而异。如前所述,当“掩码”的数据类型为布尔值时,它具有过滤功能。但是当“掩码”的数据类型是整数时,它提供“选择”功能,使用索引的元素作为原始数组的索引。
因此,在第二个示例中,由于data[1] = 2
和data[0] = 1
的结果data[mask2]
是长度为 5 的数组,而不是 3(在布尔情况下)。
换句话说,给定以下代码:
res = data[mask]
如果mask.dtype == int
, res 的长度将等于 mask 的长度。
如果mask.dtype == bool
, res 的长度将等于True
mask 中值的数量。
很不一样。
astype
最后,您可以使用该方法将一种数据类型的数组强制转换为另一种数据类型。
演示片段:
import numpy as np
data = np.array([1,2,3,4,5])
# Create a boolean mask
mask1 = np.array([True, False, True, False, True])
# Create an integer "mask", using the same logical values
mask2 = np.array([1,0,1,0,1])
# Coerce mask2 into a boolean mask
mask3 = mask2.astype(bool)
print(data) # [1 2 3 4 5]
print("-" * 80)
print(mask1) # [True False True False True]
print(mask1.dtype) # bool
print(data[mask1]) # [1 3 5]
print("-" * 80)
print(mask2) # [1 0 1 0 1]
print(mask2.dtype) # int32
print(data[mask2]) # [2 1 2 1 2]
print("-" * 80)
print(mask3) # [True False True False True]
print(mask3.dtype) # bool
print(data[mask3]) # [1 3 5]