2

次の 2 つのマスクされた配列宣言があるとします。

arr1 = ma.array([(1,2,"hello"),(10,20,"world!")],dtype=[("p1",int),("p2",float),("p3",object)])
arr1.mask["p1"][0] = True
arr1.mask["p2"][1] = True

arr2 = ma.array([(1,2,3),(10,20,30)],dtype=[("p1",int),("p2",float),("p3",int)])
arr2.mask["p1"][0] = True
arr2.mask["p2"][1] = True

ご覧のとおり、唯一の (わずかな?) 違いは、「p3」フィールドが のオブジェクトでarr1あり、 の int であることですarr2

通話arr2[0]OKです(--, 2.0, 3)

ただし、 の一部の要素をマスクするとarr1、 を呼び出すとarr1[0]次のエラーが発生します。

*** ValueError: Setting void-array with object members using buffer.

明らかに、1 つのフィールドをオブジェクトとして宣言すると、いくつかの問題が発生しますが、その理由はまったくわかりません。

これについてどう思いますか?その方法で「arr1[0]」にアクセスする必要があることを念頭に置いて、その問題を回避する方法をいくつか見つけてください。

どうもありがとう

エリック

編集: この問題は numpy バ​​ージョン < 1.8 で発生します。最新バージョン(1.8)で試してみましたが、問題ありません。

4

2 に答える 2

2

このように各dtypeフィールドに名前を付けて配列を作成する場合、実際にはnp.recarray属性を使用してフィールドにアクセスする または 配列を作成しています。

したがって、最初のフィールドにアクセスするには、次のようにarr1する必要があります。

arr1['p1']
#masked_array(data = [-- 10],
#             mask = [ True False],
#       fill_value = 999999)

の代わりにarr1[0]


編集: 2-D ソリューションは次のようになります。

b1m = np.array([[True, False, False],[False, True, False]])
b1 = np.ma.array([[1, 2, 'hello'],
                  [10, 20, 'world!']], mask=b1m, dtype=object)
b2m = np.array([[True, False, False],[False, True, False]])
b2 = np.ma.array([[1, 2, 3],
                  [10, 20, 30]], mask=b2m, dtype=object)
于 2013-10-31T12:37:34.817 に答える
0

この問題は numpy バ​​ージョン < 1.8 で発生することがわかりました。最新バージョン(1.8)で試してみましたが、問題ありません。だから私はそれと一緒に生きなければならないと思います...

ご協力いただきありがとうございます。

于 2013-11-01T13:33:42.803 に答える