我需要a通过另一个数组满足的条件来屏蔽一个数组b。
例如,a仅当相同位置的值b等于 0时才应保留值,否则返回为None。例如:
a = np.array([2, 2, 4, 0, 4, 3, 3, 3, 1, 2])
Run Code Online (Sandbox Code Playgroud)
被掩盖了
b = np.array([0, 0, 0, 1, 0, 3, 0, 5, 0, 0])
Run Code Online (Sandbox Code Playgroud)
返回
c: [2, 2, 4, None, 4, None, 3, None, 1, 2]
Run Code Online (Sandbox Code Playgroud)
我试过了
to_change = np.ma.masked_where(travel_time!=0, new_subareas)
Run Code Online (Sandbox Code Playgroud)
但这会返回:
masked_array(data=[2, 2, 4, --, 4, --, 3, --, 1, 2],
mask=[False, False, False, True, False, True,
False, True, False, False],
fill_value=999999)
Run Code Online (Sandbox Code Playgroud)
但是我找不到任何只会返回类似于为c. …
>> masks = [[1,1],[0,0]]
>> [np.ma.masked_array(data=np.array([1.0,2.0]), mask=m, fill_value=np.nan).mean() for m in masks]
[masked, 1.5]
Run Code Online (Sandbox Code Playgroud)
我想用 替换masked结果nan。有没有办法直接用 numpy's 来做到这一点masked_array?
在 vanilla Python 3 中是否有一种惯用的方法来屏蔽数组的元素?例如:
a = [True, False, True, False]
b = [2, 3, 5, 7]
b[a]
Run Code Online (Sandbox Code Playgroud)
我希望b[a]能返回[2, 5],但出现错误:
类型错误:列表索引必须是整数或切片,而不是列表
在 R 中,这按我的预期工作(使用c()而不是[]创建列表)。我知道 NumPyMaskedArray可以做到这一点,我正在寻找一种惯用的方法来用普通的 Python 来做到这一点。当然,我可以使用循环并迭代掩码列表和元素列表,但我希望有一种更有效的方法来使用更高级别的抽象来掩码元素。
我想从压缩的蒙版数组和相应的蒙版创建一个数组。用一个例子更容易解释:
>>> x=np.ma.array(np.arange(4).reshape((2,2)), mask = [[True,True],[False,False]])
>>> y=x.compressed()
>>> y
array([ 2, 3])
Run Code Online (Sandbox Code Playgroud)
现在,我想创建一个与x形状相同的数组,其中被掩码的值获得一个标准值(例如-1),其余的用给定的数组填充。它应该像这样工作:
>>> z = decompress(y, mask=[[True,True],[False,False]], default=-1)
>>> z
array([[-1, -1],
[ 2, 3]])
Run Code Online (Sandbox Code Playgroud)
问题是:是否有类似“解压缩”的方法,还是我需要自己编写代码?在Fortran中,这是通过“ pack”和“ unpack”方法完成的。感谢您的任何建议。
由于我在stackoverflow上获得了一些帮助,因此我正在使用蒙版数组,但是我在使用np.where评估蒙版数组时遇到了问题。
我的蒙版数组是:
m_pt0 = np.ma.masked_array([1, 2, 3, 0, 4, 7, 6, 5],
mask=[False, True, False, False,
False, False, False, False])
Run Code Online (Sandbox Code Playgroud)
并打印如下:
In [24]: print(m_pt0)
[1 -- 3 0 4 7 6 5]
Run Code Online (Sandbox Code Playgroud)
我正在寻找m_pt0中的索引,其中m_pt0 = 0,我希望
np.where(0 == m_pt0)
Run Code Online (Sandbox Code Playgroud)
会返回:
(array([3]))
Run Code Online (Sandbox Code Playgroud)
但是,尽管戴了口罩(或因为?),我反而得到了
(array([1, 3]),)
Run Code Online (Sandbox Code Playgroud)
使用掩码的全部目的是避免访问“空白”的索引,因此如何使用where(或其他函数)仅检索未掩码且与我的布尔条件匹配的索引。
来自 numpy数组上的 numpy 操作中的屏蔽数组的文档:
numpy.ma 模块附带了大多数 ufunc 的特定实现。每当输入被屏蔽或超出有效域时,具有有效域(例如对数或除法)的一元和二元函数都会返回屏蔽常量:例如:
ma.log([-1, 0, 1, 2])
masked_array(data = [-- -- 0.0 0.69314718056],
mask = [ True True False False],
fill_value = 1e+20)
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,对于我的计算,我需要知道这些无效操作是在哪里产生的。具体来说,我想要这样:
ma.log([-1, 0, 1, 2])
masked_array(data = [np.nan -- 0.0 0.69314718056],
mask = [ True True False False],
fill_value = 1e+20)
Run Code Online (Sandbox Code Playgroud)
冒着这个问题成为对话的风险,我的主要问题是:
masked_array在计算出的无效值(由fix_invalidnp.nan 和 np.inf 等“固定”的值)不会转换为(并与)掩码值合并的情况下,有什么好的解决方案可以解决这个问题?
我当前的解决方案是计算 上的函数masked_array.data,然后用原始掩码重建掩码数组。但是,我正在编写一个应用程序,它将用户的任意函数映射到许多不同的数组上,其中一些被屏蔽,一些则没有,并且我希望避免仅针对屏蔽数组的特殊处理程序。此外,这些数组在 MISSING、NaN 和 Inf 之间存在区别,这一点很重要,因此我不能只使用带有np.nans 的数组而不是masked值。
此外,如果有人对这种行为存在的原因有任何看法,我想知道。在同一操作中使用此功能似乎很奇怪,因为对未屏蔽值进行操作的结果的有效性实际上是用户的责任,用户可以选择使用该函数来“清理” fix_invalid。
此外,如果有人知道 numpy 中缺失值的进展情况,请分享,因为最旧的帖子是 2011-2012 …