Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.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

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 仍在访问numpy掩码数组填充值_Python_Arrays_Numpy_Indexing - Fatal编程技术网

Python 仍在访问numpy掩码数组填充值

Python 仍在访问numpy掩码数组填充值,python,arrays,numpy,indexing,Python,Arrays,Numpy,Indexing,我正在尝试将图像处理为遮罩阵列,以处理节点数据区域。我决定先在一维数组上做一些测试,我发现了一些奇怪的东西。以下是我的测试代码: a = np.array([0,1,4,3,4,-9999,33,34,-9999]) am = np.ma.MaskedArray(a) am.mask = (am==-9999) z = np.arange(35) z[am] 我希望用屏蔽数组索引z数组会成功,但我看到以下错误: Runtime error

我正在尝试将图像处理为遮罩阵列,以处理节点数据区域。我决定先在一维数组上做一些测试,我发现了一些奇怪的东西。以下是我的测试代码:

    a = np.array([0,1,4,3,4,-9999,33,34,-9999])
    am = np.ma.MaskedArray(a)
    am.mask = (am==-9999)

    z = np.arange(35)

    z[am]
我希望用屏蔽数组索引z数组会成功,但我看到以下错误:

    Runtime error 
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    IndexError: index -9999 is out of bounds for size 35
这实际上是同一件事

谢谢

试试这段代码

a = np.array([0,1,4,3,4,-9999,33,34,-9999])
am = np.ma.MaskedArray(a)
am.mask = (am==-9999)
np.ma.set_fill_value(am, 0)

z = np.arange(35)

print z[am.filled()]

访问
am
将给出掩码数组,其中掩码值引用原始值(它只是对原始数组的引用)。调用
am.filled()
在设置fill\u值后,使用
am.filled返回的数组中的fill\u值替换屏蔽元素。通常,使用标记数组进行索引是不明智的,因为屏蔽值处应发生的行为未定义

这样想:当我看你的数组
a
和数组
z
时,我可以说“好吧,
a[0]=0
所以
z[a[0]]
是有意义的。”然后继续,直到我遇到
a[5]=-9999
时,我可以说,“好吧,这作为
z
的索引是没有意义的。”然后可以提出一个例外

事实上,当您天真地使用
am
作为索引集时,将会发生这种情况。。。它恢复为使用包含所有原始值的
am.data
。相反,如果它尝试使用类似于
[z[i]for i in am]
的东西,您将遇到遇到
numpy.ma.core.MaskedConstant
的问题,它不是索引的合理值--不是用于获取值,也不是用于忽略获取值的请求

In [39]: l = [x for x in am]

In [40]: l
Out[40]: [0, 1, 4, 3, 4, masked, 33, 34, masked]

In [41]: type(l[-1])
Out[41]: numpy.ma.core.MaskedConstant
(事实上,如果您尝试对这些家伙中的一个进行索引,您会得到
索引器:用作索引的数组必须是整数(或布尔)类型

但是现在,如果我在
am.filled()
中遇到屏蔽值,会发生什么?
am.filled()
第5个索引处的条目不会是
numpy.ma.core.MaskedConstant
的实例——它将是您选择的任何填充值。如果这个填充值作为一个索引是有意义的,那么实际上您将通过索引该索引来获取一个值。以0为例。它看起来是一个无害的中性填充值,但实际上它表示一个有效的索引,因此您可以额外访问
z
的第0个条目:

In [42]: am.fill_value = 0

In [43]: z[am.filled()]
Out[43]: array([ 0,  1,  4,  3,  4,  0, 33, 34,  0])
这也不是面具应该做的

一种不成熟的方法是迭代
am
并排除
类型为
np.ma.core.MaskedConstant
的任何内容:

In [45]: z[np.array([x for x in am if type(x) is not np.ma.core.MaskedConstant])]
Out[45]: array([ 0,  1,  4,  3,  4, 33, 34])
但实际上,所有这些的一个更清晰的表达方式是首先使用简单的逻辑索引:

In [47]: z[a[a != -9999]]
Out[47]: array([ 0,  1,  4,  3,  4, 33, 34])
请注意,这样的逻辑索引对于2D数组很有效,只要您愿意接受,一旦对高维数组进行了逻辑索引,如果结果不再符合相同的常规2D形状,那么它将以1D形式显示,如下所示:

In [58]: a2 = np.array([[10, -9999, 13], [-9999, 1, 8], [1, 8, 1]])

In [59]: a2
Out[59]: 
array([[   10, -9999,    13],
       [-9999,     1,     8],
       [    1,     8,     1]])

In [60]: z2 = np.random.rand(3,3)

In [61]: z2[np.where(a2 != -9999)]
Out[61]: 
array([ 0.4739082 ,  0.13629442,  0.46547732,  0.87674102,  0.08753297,
        0.57109764,  0.39722408])
如果您想要类似于遮罩效果的效果,则只需将值设置为等于
NaN
(对于
float
数组):


这种带有
NaN
的掩蔽形式适用于NumPy中的许多矢量化数组计算,尽管首先要担心将基于整数的图像数据转换为浮点,然后在最后安全地转换回来,这可能是一件痛苦的事情。

谢谢F先生!这是一个非常透彻的解释,我相信其他人也会欣赏。我想补充一些。我习惯于在需要数学操作、变换等的图像处理应用程序中相当轻松地处理节点数据区域。,但我正在编写一个直方图匹配程序,它需要索引,因此需要尝试使用屏蔽数组。我认为循环方法最适合我的特定用例。再次感谢!
In [58]: a2 = np.array([[10, -9999, 13], [-9999, 1, 8], [1, 8, 1]])

In [59]: a2
Out[59]: 
array([[   10, -9999,    13],
       [-9999,     1,     8],
       [    1,     8,     1]])

In [60]: z2 = np.random.rand(3,3)

In [61]: z2[np.where(a2 != -9999)]
Out[61]: 
array([ 0.4739082 ,  0.13629442,  0.46547732,  0.87674102,  0.08753297,
        0.57109764,  0.39722408])
In [66]: a2 = np.array([[10, -9999, 13], [-9999, 1, 8], [1, 8, 1]], dtype=np.float)

In [67]: a2
Out[67]: 
array([[  1.00000000e+01,  -9.99900000e+03,   1.30000000e+01],
       [ -9.99900000e+03,   1.00000000e+00,   8.00000000e+00],
       [  1.00000000e+00,   8.00000000e+00,   1.00000000e+00]])

In [68]: a2[np.where(a2 == -9999)] = np.NaN

In [69]: a2
Out[69]: 
array([[ 10.,  nan,  13.],
       [ nan,   1.,   8.],
       [  1.,   8.,   1.]])