python编写函数反转数组_python-反转“ numpy.ma.compressed”操作

尽管我回答了许多妈妈的问题,但我绝不是专家.但我会探讨这个问题

让我们概括一下数组:

In [934]: x=np.ma.array(np.arange(6).reshape((2,3)), mask = [[True,True,False],[False,False,True]])

In [935]: x

Out[935]:

masked_array(data =

[[-- -- 2]

[3 4 --]],

mask =

[[ True True False]

[False False True]],

fill_value = 999999)

In [936]: y=x.compressed()

In [937]: y

Out[937]: array([2, 3, 4])

y除了值的子集外,没有关于x的信息.请注意这是1d

x将其值存储在2个数组中(实际上,这些是访问基础._data和._mask属性的属性):

In [938]: x.data

Out[938]:

array([[0, 1, 2],

[3, 4, 5]])

In [939]: x.mask

Out[939]:

array([[ True, True, False],

[False, False, True]], dtype=bool)

我的猜测是,要解压缩,我们需要创建一个具有正确dtype,shape和mask的空蒙版数组,并将y的值复制到其数据中.但是,应将哪些值放入数据的掩码元素中?

还是解决问题的另一种方法-是否可以将值从y复制回x?

一种可能的解决方案是将新值复制到x [?x.mask]:

In [957]: z=2*y

In [958]: z

Out[958]: array([4, 6, 8])

In [959]: x[~x.mask]=z

In [960]: x

Out[960]:

masked_array(data =

[[-- -- 4]

[6 8 --]],

mask =

[[ True True False]

[False False True]],

fill_value = 999999)

In [961]: x.data

Out[961]:

array([[0, 1, 4],

[6, 8, 5]])

或制作一个新的数组

In [975]: w=np.zeros_like(x)

In [976]: w[~w.mask]=y

In [977]: w

Out[977]:

masked_array(data =

[[-- -- 2]

[3 4 --]],

mask =

[[ True True False]

[False False True]],

fill_value = 999999)

In [978]: w.data

Out[978]:

array([[0, 0, 2],

[3, 4, 0]])

另一种方法是制作一个充满无效值的规则数组,像这样复制y,然后将整个对象变成一个掩码数组.可能有一个带掩码的数组构造函数,使您仅可以将有效值与掩码一起指定.但是我必须为此深入研究文档.

===============

使用np.place作为设置值的另一个操作序列将执行此操作

In [1011]: w=np.empty_like(x)

In [1014]: np.place(w,w.mask,999)

In [1015]: np.place(w,~w.mask,[1,2,3])

In [1016]: w

Out[1016]:

masked_array(data =

[[-- -- 1]

[2 3 --]],

mask =

[[ True True False]

[False False True]],

fill_value = 999999)

In [1017]: w.data

Out[1017]:

array([[999, 999, 1],

[ 2, 3, 999]])

====================

看着

https://github.com/numpy/numpy/blob/master/numpy/ma/core.py

class _MaskedBinaryOperation:

此类用于实现带掩码的ufunc.它在有效单元格(未屏蔽的)上评估ufunc,并返回带有有效数组的新的屏蔽数组,而屏蔽值保持不变(与原始值相比)

例如,对于简单的掩码数组,1不会更改掩码值.

In [1109]: z=np.ma.masked_equal([1,0,2],0)

In [1110]: z

Out[1110]:

masked_array(data = [1 -- 2],

mask = [False True False],

fill_value = 0)

In [1111]: z.data

Out[1111]: array([1, 0, 2])

In [1112]: z+1

Out[1112]:

masked_array(data = [2 -- 3],

mask = [False True False],

fill_value = 0)

In [1113]: _.data

Out[1113]: array([2, 0, 3])

In [1114]: z.compressed()+1

Out[1114]: array([2, 3])

_MaskedUnaryOperation可能更易于遵循,因为它只需要使用1个掩码数组即可.

例如,常规日志的掩码0值存在问题:

In [1115]: z.log()

...

/usr/local/bin/ipython3:1: RuntimeWarning: divide by zero encountered in log

#!/usr/bin/python3

Out[1116]:

masked_array(data = [0.0 -- 0.6931471805599453],

mask = [False True False],

fill_value = 0)

但是被屏蔽的日志会跳过被屏蔽的条目:

In [1117]: np.ma.log(z)

Out[1117]:

masked_array(data = [0.0 -- 0.6931471805599453],

mask = [False True False],

fill_value = 0)

In [1118]: _.data

Out[1118]: array([ 0. , 0. , 0.69314718])

糟糕-_MaskedUnaryOperation可能没那么有用.它以所有值np.ma.getdata(z)评估ufunc,并带有错误状态上下文来阻止警告.然后,它使用掩码将掩码值复制到结果上(np.copyto(result,d,where = m)).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值