如何在numpy中构造`np.record`

t9eec4r0  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(92)

下面的代码用结构化的dtype构造数组

import numpy as np
arr = np.zeros(3, dtype=[('a', 'i4'), ('b', bool)]).view(np.recarray)
x = arr[0]

字符串
x的类型是np.record,我可以使用x.ax.b来访问它的类型。
如何直接构造一个类似的np.record对象(不先创建recarray),并使其值为(3, True)np.record函数的文档中没有足够的信息。

kmbjn2e3

kmbjn2e31#

这使得单个元素,()形状,结构化数组:

In [380]: arr=np.array((3,True), dtype=[('a', 'i4'), ('b', bool)])    
In [381]: arr
Out[381]: array((3, True), dtype=[('a', '<i4'), ('b', '?')])

字符串
按名称访问字段:

In [382]: arr['a']
Out[382]: array(3, dtype=int32)


该元素可以通过[()]索引访问。arr.item()产生一个元组。

In [384]: type(arr[()])
Out[384]: numpy.void


要重新排列,请使用view。或者np.recarray(...),但这更像是使用np.empty

In [385]: arr=np.array((3,True), dtype=[('a', 'i4'), ('b', bool)]).view(np.recarray)    
In [386]: arr
Out[386]: 
rec.array((3, True),
          dtype=[('a', '<i4'), ('b', '?')])


现在元素是record

In [387]: arr[()]
Out[387]: (3, True)    
In [388]: type(_)
Out[388]: numpy.record


数组和记录都可以使用.a属性(['a']仍然有效):

In [389]: arr.a
Out[389]: array(3, dtype=int32)    
In [390]: arr[()].a
Out[390]: 3


我不确定recarray层是否为结构化阵列功能增加了很多功能。这感觉就像一个遗留功能。

编辑

In [20]: np.record((3, True), dtype=[('a', 'i4'), ('b', bool)]).view(np.recarray)
Out[20]: (3, True)
In [21]: type(_)
Out[21]: numpy.record
In [24]: np.record((3, True), dtype=[('a', 'i4'), ('b', bool)]).view(np.recarray).b
Out[24]: True

vjhs03f7

vjhs03f72#

要创建您要查找的对象,您只需将值和dtype传递给np.record构造函数:

>>> x = np.record((3, True), dtype=[('a', 'i4'), ('b', bool)])
>>> x.dtype
dtype([('a', '<i4'), ('b', '?')])

字符串
如果你想使用数组,而不是用np.zeros()初始化数组,你可以使用np.full()。这将提供您正在寻找的输出:

>>> np.full(3, x)
array([(3,  True), (3,  True), (3,  True)],
      dtype=[('a', '<i4'), ('b', '?')])

相关问题