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”字段是一个对象 forarr1和一个 int for arr2

呼叫arr2[0]是好的并且给(--, 2.0, 3)

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

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

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

您对此有何看法,您是否会看到一些规避该问题的方法,请记住,我确实需要以这种方式访问​​“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].


编辑:二维解决方案将类似于:

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 回答