说我有以下两个蒙版数组声明:
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),没关系。
答案 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),没关系。所以我想我必须忍受......
感谢您的帮助。