4

我有以下数据结构:

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]?我想要的是将指向 b 的指针存储在 a 中,因为我不需要创建副本,因为 b 中的数据对于 a 的每一行都是相同的。

我累了

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

它可以工作,但会破坏数组的嵌套结构。有没有办法保留结构化数组功能,例如a['B']['D']

谢谢

4

2 回答 2

4

最简洁的答案是不。尽管numpy数组的语法看起来与标准的 Python 语法相同,但幕后发生的事情却大不相同。复杂的numpy数据类型,例如TA使用大块连续内存来存储每条记录;内存必须定期布局,否则一切都会崩溃。

因此,当您创建一个包含 1000 项的嵌套数据类型的数组时TA,实际上分配了 1000 个内存块,每个内存块都足够大以包含N不同的TB数组。这就是为什么你可以做这样的事情a['B']['D']——或者,指出一点,这样的事情:

>>> (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

对于普通的 Python 对象,上述操作会失败,因为对象项访问顺序很重要。实际上很奇怪,这在 中是可能的numpy,唯一可能的原因是numpy使用了统一结构的连续内存。

据我所知,numpy没有提供任何方法来完成您所要求的事情(如果我错了,请有人纠正我!),并且所需的间接性可能涉及对numpyAPI 的重大更改。

我要补充一点,无论如何我认为这样做没有多大意义。如果只需要一个数组副本,为什么不将它存储在数组之外呢?您甚至可以将它与 numpy 数组一起传递,作为 atuplenamedtuple.

于 2012-08-09T15:14:37.493 回答
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])
于 2012-08-10T01:41:22.170 回答