python - 修改函数内的屏蔽数组的一部分
python - modify part of a masked array inside a function
我需要修改函数内的屏蔽数组的一部分,例如:
import numpy.ma as ma
arr_2d = ma.masked_all((5,5))
arr_3d = ma.masked_all((5,5,5))
arr_3d[0,1] = 5
def func1(arr, val):
arr[:] = val
看起来很简单,但是......
>>> func1(arr_3d[0], 1)
>>> arr_3d[0]
masked_array(data =
[[-- -- -- -- --]
[1.0 1.0 1.0 1.0 1.0]
[-- -- -- -- --]
[-- -- -- -- --]
[-- -- -- -- --]],
mask =
[[ True True True True True]
[False False False False False]
[ True True True True True]
[ True True True True True]
[ True True True True True]],
fill_value = 1e+20)
这似乎与始终在数组的一部分上设置共享掩码有关,以便将掩码作为副本传递给函数
我希望除了显式传递掩码、返回数据副本或传递
带有索引的更大数组。
最近的 numpy 中的警告是:
In [738]: func1(A[1],1)
/usr/local/bin/ipython3:2: MaskedArrayFutureWarning: setting an item on
a masked array which has a shared mask will not copy the mask and also
change the original mask array in the future.
Check the NumPy 1.11 release notes for more information.
http://docs.scipy.org/doc/numpy/release.html#assigning-to-slices-views-of-maskedarray
Currently a slice of a masked array contains a view of the original data and a copy-on-write view of the mask. Consequently, any changes to the slice’s mask will result in a copy of the original mask being made and that new mask being changed rather than the original.
此操作后,A 的第 1 行仍被屏蔽,但 A[
,:].data` 已更改。
In [757]: B=np.ma.masked_all((5))
...
In [759]: B[0]=5 # direct __setitem__ change to B
In [760]: B
Out[760]:
masked_array(data = [5.0 -- -- -- --],
mask = [False True True True True],
fill_value = 1e+20)
In [761]: func1(B[3:],1)
/usr/local/bin/ipython3:2: MaskedArrayFutureWarning: ....
In [762]: B # no change to mask
Out[762]:
masked_array(data = [5.0 -- -- -- --],
mask = [False True True True True],
fill_value = 1e+20)
In [763]: B.data # but data is changed
Out[763]: array([ 5., 0., 0., 1., 1.])
A[1,:]=1
是对掩码 __setitem__
的直接使用,它可以完全负责设置 data
和 mask
。在您的函数中 A
是原始视图,通过 A.__getitem__
调用获得。显然,开发人员担心对此视图掩码的更改是否会影响原始掩码。
我们可能要看看开发者的讨论;警告表明最近发生了一些变化。
============
问题不在于函数中的使用,而在于视图
In [764]: B1=B[3:]
In [765]: B1[:]=2
/usr/local/bin/ipython3:1: MaskedArrayFutureWarning:...
In [766]: B
Out[766]:
masked_array(data = [5.0 -- -- -- --],
mask = [False True True True True],
fill_value = 1e+20)
In [767]: B.data
Out[767]: array([ 5., 0., 0., 2., 2.])
警告描述了现在正在发生的事情,可能还会持续一段时间。据说这种做法会改变。
遵循更改说明建议:
In [785]: B1=B[3:]
In [787]: B1._sharedmask
Out[787]: True
In [790]: B1._sharedmask=False
In [791]: B1[:]=4
In [792]: B1
Out[792]:
masked_array(data = [4.0 4.0],
mask = [False False],
fill_value = 1e+20)
In [793]: B # mask has been changed along with data
Out[793]:
masked_array(data = [5.0 -- -- 4.0 4.0],
mask = [False True True False False],
fill_value = 1e+20)
如此变化
def func1(arr,val):
arr._sharedmask=False
arr[:]=val
将停止警告,并修改原数组的掩码。
我需要修改函数内的屏蔽数组的一部分,例如:
import numpy.ma as ma
arr_2d = ma.masked_all((5,5))
arr_3d = ma.masked_all((5,5,5))
arr_3d[0,1] = 5
def func1(arr, val):
arr[:] = val
看起来很简单,但是......
>>> func1(arr_3d[0], 1)
>>> arr_3d[0]
masked_array(data =
[[-- -- -- -- --]
[1.0 1.0 1.0 1.0 1.0]
[-- -- -- -- --]
[-- -- -- -- --]
[-- -- -- -- --]],
mask =
[[ True True True True True]
[False False False False False]
[ True True True True True]
[ True True True True True]
[ True True True True True]],
fill_value = 1e+20)
这似乎与始终在数组的一部分上设置共享掩码有关,以便将掩码作为副本传递给函数
我希望除了显式传递掩码、返回数据副本或传递 带有索引的更大数组。
最近的 numpy 中的警告是:
In [738]: func1(A[1],1)
/usr/local/bin/ipython3:2: MaskedArrayFutureWarning: setting an item on
a masked array which has a shared mask will not copy the mask and also
change the original mask array in the future.
Check the NumPy 1.11 release notes for more information.
http://docs.scipy.org/doc/numpy/release.html#assigning-to-slices-views-of-maskedarray
Currently a slice of a masked array contains a view of the original data and a copy-on-write view of the mask. Consequently, any changes to the slice’s mask will result in a copy of the original mask being made and that new mask being changed rather than the original.
此操作后,A 的第 1 行仍被屏蔽,但 A[
,:].data` 已更改。
In [757]: B=np.ma.masked_all((5))
...
In [759]: B[0]=5 # direct __setitem__ change to B
In [760]: B
Out[760]:
masked_array(data = [5.0 -- -- -- --],
mask = [False True True True True],
fill_value = 1e+20)
In [761]: func1(B[3:],1)
/usr/local/bin/ipython3:2: MaskedArrayFutureWarning: ....
In [762]: B # no change to mask
Out[762]:
masked_array(data = [5.0 -- -- -- --],
mask = [False True True True True],
fill_value = 1e+20)
In [763]: B.data # but data is changed
Out[763]: array([ 5., 0., 0., 1., 1.])
A[1,:]=1
是对掩码 __setitem__
的直接使用,它可以完全负责设置 data
和 mask
。在您的函数中 A
是原始视图,通过 A.__getitem__
调用获得。显然,开发人员担心对此视图掩码的更改是否会影响原始掩码。
我们可能要看看开发者的讨论;警告表明最近发生了一些变化。
============
问题不在于函数中的使用,而在于视图
In [764]: B1=B[3:]
In [765]: B1[:]=2
/usr/local/bin/ipython3:1: MaskedArrayFutureWarning:...
In [766]: B
Out[766]:
masked_array(data = [5.0 -- -- -- --],
mask = [False True True True True],
fill_value = 1e+20)
In [767]: B.data
Out[767]: array([ 5., 0., 0., 2., 2.])
警告描述了现在正在发生的事情,可能还会持续一段时间。据说这种做法会改变。
遵循更改说明建议:
In [785]: B1=B[3:]
In [787]: B1._sharedmask
Out[787]: True
In [790]: B1._sharedmask=False
In [791]: B1[:]=4
In [792]: B1
Out[792]:
masked_array(data = [4.0 4.0],
mask = [False False],
fill_value = 1e+20)
In [793]: B # mask has been changed along with data
Out[793]:
masked_array(data = [5.0 -- -- 4.0 4.0],
mask = [False True True False False],
fill_value = 1e+20)
如此变化
def func1(arr,val):
arr._sharedmask=False
arr[:]=val
将停止警告,并修改原数组的掩码。