Numpy嵌套结构化数组通过引用

时间:2012-08-09 14:08:10

标签: python arrays numpy structured-data

我有以下数据结构:

N=100
TB =     {'names':('n', 'D'),'formats':(int, int)}
TA =     {'names':('id', 'B'),'formats':(int, dtype((TB, (N))))}
a = np.empty(1000, dtype=TA)
b = np.empty(N, dtype=TB)

其中a是具有两个字段的结构化数组:'id'和'B'。在'B'中存储另一个具有字段'n'和D的结构化数组,例如

for i in range(0,1000):
   a['B'][i] = b

执行上述分配时,b中的数据被复制到a。有没有办法只将参考文献复制到b,这样当我更改b时,更改会反映在a['B'][i]中?我想要的是将指针存储到a中的b,因为我不需要创建副本,因为b中的数据对于a的每一行都是相同的。

我累了

TA = {'names':('id', 'B'),'formats':(int, object)}

它可以工作,但打破了数组的嵌套结构。是否存在保留结构化阵列功能的方法,例如a['B']['D']

由于

2 个答案:

答案 0 :(得分:4)

简短的回答是否定的。虽然numpy数组的语法与标准python语法相同,但幕后发生的事情却截然不同。像numpy这样的复杂TA数据类型使用大块连续内存来存储每条记录;记忆必须定期布置,否则一切都会崩溃。

因此,当您使用嵌套数据类型TA创建1000项数组时,实际上是在分配1000块内存,每块内存足够大以包含N distinct {{1数组。这就是为什么你可以做TB之类的事情 - 或者指出一点,就像这样:

a['B']['D']

对于普通的Python对象,上述操作会失败,因为对象项访问顺序很重要。实际上非常奇怪,这在>>> (a['B'][1]['D'] == a['B']['D'][1]).all() True >>> a['B'][1]['D'][0] = 123456789 >>> (a['B'][1]['D'] == a['B']['D'][1]).all() True 中是可能的,唯一的原因是numpy使用统一结构化的连续内存。

据我所知,numpy没有提供任何方法来做你所要求的(如果我错了,有人会纠正我!),所需的间接可能会涉及{ {1}}的API。

我要补充一点,无论如何我认为这样做并不是很有意义。如果只需要一个数组副本,为什么不将它存储在数组外?您甚至可以将它与numpy数组一起传递,作为numpynumpy的一部分。

答案 1 :(得分:0)

是的,你可以打开一个视图。但是,正如你所描述的那样,它的工作原理相反:

>>> a = np.array([1,2,3,4,5,6])
>>> b = a[2:4].view()
>>> b[0] = 0
>>> b[1] = 0
>>> a
array([1, 2, 0, 0, 5, 6])