python - 仅屏蔽 numpy 中特定范围的索引

标签 python arrays numpy masking masked-array

我有一个 ndarray。我需要屏蔽任何小于 50 的数字,直到遇到的第一个数字大于 50。这应该在行的开头和结尾处完成。是的,当遇到的第一个数字 > 50 时,屏蔽应该停止。

一行看起来像:

    [ 0   1   1   0  57  121  120  157  77  14   0   3   0   0   0   0  67 100  
    98  97 101 129 139 105  97 105 181 126  10   0   0]

我想要这样的东西:

    [-- -- -- -- 57 121 120 157 77 14  0  3  0  0  0  0 67 100 98 97
 101 129 139 105 97 97 105 181 126 -- -- --]

掩码应在第二行的 57 之前停止,在倒数第四行的 126 处停止。

我尝试过 ma.masked_where,但它也掩盖了之间的 0,这是我不想要的。

那么,如果有办法做到这一点,或者您可以帮助我,以便我可以指定一系列索引,例如:仅应屏蔽的[0:40]

我不想在屏蔽后更改数组的维度。另外,-- 的存在不会对我的目的产生影响。

最佳答案

您可以使用 bool 索引或手动迭代。前者对于小型阵列更有效;后者适用于两侧都有少量超出范围值的大型数组。

bool 索引

x = np.array([0, 0, 0, 2, 3, 51, 34, 1, 23, 32, 32, 52, 0, 0, 0])

start = (x > 50).argmax()
end = len(x) - (x[::-1] > 50).argmax()

print(x[start: end])

[51 34  1 23 32 32 52]

手动迭代

next 与生成器表达式和枚举结合使用:

start = next(idx for idx, val in enumerate(x) if val > 50)
end = len(x) - next(idx for idx, val in enumerate(reversed(x)) if val > 50)

print(x[start: end])

[51 34  1 23 32 32 12]

屏蔽

如果您希望用 np.nan 替换超出范围的值,您可以进行相应的分配,记住首先转换为 float,如 NaN 值为 float:

x = x.astype(float)
x[:start] = np.nan
x[end:] = np.nan

print(x)

array([nan, nan, nan, nan, nan, 51., 34.,  1., 23., 32., 32., 52., nan, nan, nan])

关于python - 仅屏蔽 numpy 中特定范围的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52467098/

相关文章:

c - C 中的可变数组大小

python - 向量化实现以获取每行中最小元素的索引

python - 提高 Python 中矩阵计算的执行时间

python - 一个类应该在初始化时转换参数的类型吗?如果是这样,怎么做?

python - 如何使输出更具可读性?

javascript - 从数组中删除元素(待办事项列表应用程序)

python - 快速将数组分配给长度相等的 n 个 bin

Python re.sub repl w/函数、错误或正确行为?

python - 滚动应用函数必须是实数,而不是Nonetype

c++ - 数组初始化知识