Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy嵌套结构数组(按引用)_Python_Arrays_Numpy_Structured Data - Fatal编程技术网

Python Numpy嵌套结构数组(按引用)

Python Numpy嵌套结构数组(按引用),python,arrays,numpy,structured-data,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

我有以下数据结构:

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']


谢谢

简短的回答是否定的。尽管
numpy
数组的语法看起来与标准python语法相同,但幕后发生的事情却大不相同。复杂的
numpy
数据类型,如
TA
使用大块连续内存来存储每条记录;记忆必须定期整理,否则一切都会分崩离析

因此,当您使用嵌套数据类型(如
TA
)创建一个1000项数组时,实际上分配了1000个内存块,每个内存块都足以包含
N
distinct
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
没有提供任何方法来满足您的要求(如果我错了,请有人纠正我!),所需的间接操作可能涉及对
numpy
的API进行重大更改


我要补充一点,我认为这样做没有多大意义。如果只需要阵列的一个副本,为什么不将其存储在阵列外部?您甚至可以将它与numpy数组一起传递,作为
元组
命名元组
的一部分

是的,您可以打开一个视图。但正如您所描述的,它的工作方式正好相反:

>>> 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])

谢谢你的回复。我没有考虑过访问顺序,现在我明白你的意思了。我也曾考虑过按照您的建议使用namedtuples,但从接口的角度来看,仍然需要一个“纯”的结构化阵列解决方案。经过一些尝试和错误,我将问题分解为以下几个方面:经过一些尝试和错误,我将问题分解为以下几个方面:
A=np.one(10);AA=np.empty(1,dtype=object);AA[0]=np.ones(10)
。如果可以使用AA.view()或AA.astype()将AA转换为A的type/dtype,那么这将给出解决方案,但到目前为止,我还没有找到一种方法,将视图分配给结构化数组也会复制数据,因此我们的建议不起作用。解决方法是创建一个dtype=object的数组,但是有没有办法将这样一个数组的视图转换/打开为原始的dtype?maryam,视图不会复制数据。它是对内存中数据所在区域的引用,而不是在将数据传递给结构化数组时:
a=np.zeros(1,dtype='int,10int');B=np.arange(10);A['f1']=B.view();B*=0;打印B;打印一个比较:
AA=np.zero(1,dtype='int,object');B=np.arange(10);AA['f1'][0]=B;B*=0;打印B;打印AA
现在我正在寻找AA的转换/视图,以类似于