我有以下数据结构:
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']
由于
答案 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数组一起传递,作为numpy
或numpy
的一部分。
答案 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])