当一个dtype是一个对象时,numpy masked数组的行为会有所不同

时间:2013-10-31 11:26:54

标签: python arrays numpy masking recarray

说我有以下两个蒙版数组声明:

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" field是arr1的对象,arr2的int。

调用arr2[0]即可,并提供(--, 2.0, 3)

但是,在屏蔽arr1的某些元素时,调用arr1[0]会出现以下错误:

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

显然,将一个字段声明为对象会引发一些麻烦,但我不知道为什么会这样。

你怎么看待这个问题,你会看到一些方法来规避这个问题,记住我真的需要访问' arr1 [0]'在那条路上?

非常感谢

埃里克

编辑:numpy版本< 1.8。我尝试使用最新版本(1.8),没关系。

2 个答案:

答案 0 :(得分:2)

创建这样的数组时,为每个dtype字段,you are actually creating a 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)

答案 1 :(得分:0)

我发现这个问题出现在numpy版本< 1.8。我试过最新版本(1.8),没关系。所以我想我必须忍受......

感谢您的帮助。