39

マスクされた配列のドキュメントを数回読んで、どこでも検索して、完全にばかげていると感じました。ある配列から別の配列にマスクを適用する方法を、私の人生では理解できません。

例:

import numpy as np

y = np.array([2,1,5,2])          # y axis
x = np.array([1,2,3,4])          # x axis
m = np.ma.masked_where(y>2, y)   # filter out values larger than 5
print m
[2 1 -- 2]
print np.ma.compressed(m)
[2 1 2]

したがって、これは正常に機能します....しかし、この y 軸をプロットするには、一致する x 軸が必要です。y 配列から x 配列にマスクを適用するにはどうすればよいですか? このようなものは理にかなっていますが、ごみを生成します:

new_x = x[m.mask].copy()
new_x
array([5])

では、一体どのようにそれが行われるのでしょうか (新しい x 配列は新しい配列である必要があることに注意してください)。

編集:

さて、これを行う1つの方法は次のように思えます:

>>> import numpy as np
>>> x = np.array([1,2,3,4])
>>> y = np.array([2,1,5,2])
>>> m = np.ma.masked_where(y>2, y)
>>> new_x = np.ma.masked_array(x, m.mask)
>>> print np.ma.compressed(new_x)
[1 2 4]

しかし、それは信じられないほど厄介です!IDL と同じくらいエレガントなソリューションを見つけようとしています...

4

3 に答える 3

26

同様の問題がありましたが、それらを適用するために、より多くのマスキングコマンドとより多くの配列をロードする必要があります。私の解決策は、1 つの配列ですべてのマスキングを行い、最終的にマスクされた配列をmask_whereコマンドの条件として使用することです。

例えば:

y = np.array([2,1,5,2])                         # y axis
x = np.array([1,2,3,4])                         # x axis
m = np.ma.masked_where(y>5, y)                  # filter out values larger than 5
new_x = np.ma.masked_where(np.ma.getmask(m), x) # applies the mask of m on x

良い点は、このマスクをさらに多くの配列に適用できることです。配列ごとにマスキング プロセスを実行する必要はありません。

于 2013-08-15T09:53:07.537 に答える
20

なぜ単純に

import numpy as np

y = np.array([2,1,5,2])          # y axis
x = np.array([1,2,3,4])          # x axis
m = np.ma.masked_where(y>2, y)   # filter out values larger than 5
print list(m)
print np.ma.compressed(m)

# mask x the same way
m_ = np.ma.masked_where(y>2, x)   # filter out values larger than 5
# print here the list
print list(m_) 
print np.ma.compressed(m_)

コードは Python 2.x 用です

また、ジョリスが提案したように、これはnew_x = x[~m.mask].copy()配列を与える作業を行います

>>> new_x
array([1, 2, 4])
于 2013-05-11T09:06:57.843 に答える