29

次のような座標の 2 次元配列があるとします。

x = array([[1,2],[2,3],[3,4]])

これまでの私の仕事では、最終的に次のようなマスクを生成しました

mask = [False,False,True]

このマスクを 2D 座標ベクトルで使用しようとすると、エラーが発生します

newX = np.ma.compressed(np.ma.masked_array(x,mask))

>>>numpy.ma.core.MaskError: Mask and data not compatible: data size 
   is 6, mask size is 3.`

これは理にかなっていると思います。そこで、代わりに次のマスクを単純に使用しようとしました。

mask2 = np.column_stack((mask,mask))
newX = np.ma.compressed(np.ma.masked_array(x,mask2))

そして、私が得るものは近いです:

>>>array([1,2,2,3])

私が期待する(そして欲しい)ものに:

>>>array([[1,2],[2,3]])

これを行う簡単な方法があるはずですか?

4

6 に答える 6

21

これはあなたが探しているものですか?

import numpy as np
x[~np.array(mask)]
# array([[1, 2],
#        [2, 3]])

またはnumpyマスク配列から:

newX = np.ma.array(x, mask = np.column_stack((mask, mask)))
newX

# masked_array(data =
#  [[1 2]
#  [2 3]
#  [-- --]],
#              mask =
#  [[False False]
#  [False False]
#  [ True  True]],
#        fill_value = 999999)
于 2016-07-05T01:30:28.507 に答える
1

最後の例では、問題はマスクではありません。の使用ですcompressed。のドキュメント文字列からcompressed:

Return all the non-masked data as a 1-D array.

したがってcompressed、マスクされていない値を 1 次元配列にフラット化します。(圧縮されたデータが n 次元構造を持つという保証はないため、そうする必要があります。)

圧縮する前に、マスクされた配列を見てください。

In [8]: np.ma.masked_array(x, mask2)

Out[8]: 
masked_array(data =
 [[1 2]
 [2 3]
 [-- --]],
             mask =
 [[False False]
 [False False]
 [ True  True]],
       fill_value = 999999)
于 2016-07-05T01:46:09.640 に答える